Grundlagen der Softwareentwicklung

Dinge, die jeder Informatiker wissen sollte

Dieses Dokument fasst die Grundlagen der Softwareentwicklung zusammen, die für das Absolvieren der Übungen in Info 2, Netzwerksicherheit, sowie für viele Bachelor- und Masterarbeiten wichtig sind.

Dateisystem/Pfade

Ein Dateisystem erlaubt es, beliebige Inhalte unter Dateinamen zu speichern und mittels Verzeichnissen zu ordnen. Um auf eine bestehende Datei zu verweisen, verwendet man den Pfad einer Datei. Dieser kann entweder absolut oder relativ sein.

Absolute Pfade fangen mit einem Slash an, z.B. /home/smith/foo/bar. Wie der Name sagt, sind sie immer absolut, fangen also beim Wurzelverzeichnis / an.

Weil es ziemlich umständlich wäre, jedes Mal den gesamten Verzeichnispfad zu berechnen und zu verwenden, kann man den Pfad auch relativ zum current working directory (cwd) angeben (dann fängt er nicht mit einem Slash an). Die speziellen Dateinamen . und .. können verwendet werden, um auf das aktuelle und das übergeordnete Verzeichnis zu referenzieren.

Aufgabe

Nennen Sie mindestens vier verschiedene Möglichkeiten, um auf die Datei /home/smith/foo/bar zu verweisen, wenn das cwd /home/smith/foo ist.

Programme

Auf einem modernen Betriebssystem laufen mehrere Programme gleichzeitig in verschiedenen Prozessen. Wenn ein Prozess gestartet wird, assoziiert das Betriebssystem (u.a.) die folgenden Eigenschaften:

Ein Prozess kann sich mit dem Systemaufruf fork inklusive aller Eigenschaften außer Prozess-Identität duplizieren. Mit execve kann ein Prozess die Ausführung eines beliebigen Programms starten. Diese beiden Systemaufrufe werden normalerweise kombiniert, um einen Kindprozess zu starten.

Aufgabe

Schreiben Sie ein Programm, das alle oben erwähnten Eigenschaften auf stdout ausgibt.

Shell

Eine shell ermöglicht es, beliebige Programme mit beliebigen Optionen zu starten. Interaktive shells laufen normalerweise in einem grafischem Terminal-Emulator wie gnome-terminal, Konsole, xfce4-terminal, oder yakuake.

Jeder Befehl wird mit Enter terminiert. Jeder Befehl kann drei Formen annehmen:

  1. Starten einer ausführbaren Datei, mit expliziter Pfad-Angabe.
    Mit /bin/ls kann die ausführbare Datei ls im Verzeichnis /bin ausgeführt werden. ls zeigt den Inhalt des aktuellen Verzeichnisses an.
  2. Starten einer ausführbaren Datei. Damit man nicht jedes Mal den gesamten Pfad eingeben muss, kann die shell automatisch das Program suchen. Das macht sie genau dann, wenn im Befehl kein Slash vorkommt. Dann wird in jedem Verzeichnis in dem Doppelpunkt-getrennten Wert der Umgebungsvariable PATH gesucht. Darum kann man z.B. einfach ls eingeben, wenn der PATH /usr/bin:/bin:/usr/local/bin ist.
  3. Shell builtin: In manchen Fällen möchte man den Zustand der Shell selber verändern. Dafür fängt die Shell bestimmte Programmnamen ab und interpretiert sie selber. Zum Beispiel kann mit cd das cwd gewechselt werden.

In allen Fällen erlaubt die Shell auch die Übergabe von Argumenten. Dafür wird die eingegebene Zeile mit Leerzeichen getrennt. Z.B. kann man den Inhalt des aktuellen Verzeichnisses und von /home mit ls . /home angezeigt werden.

Um Leer- und Sonderzeichen in den Argumenten zu vergeben, können entweder einfache oder doppelte Anführungszeichen verwendet werden, oder das betreffende Zeichen mit einem Backslash maskiert werden. Zum Beispiel können Sie den Inhalt des Verzeichnisses Meine Bilder mit ls Meine\ Bilder, ls "Meine Bilder" oder ls 'Meine Bilder' anzeigen.

Aufgabe

Schreiben Sie eine einfache Shell, die alle oben erwähnten Features unterstützt.

Endianness

Wenn eine CPU längere Zahlen speichert, verwendet sie dafür mehrere (Byte-große) Speicherplätze. Für die Anordung dieser Speicherplätze gibt es zwei verschiedene Philosophien:

Big Endian speichert das signifikanteste Bit zuerst. Die hexadezimale Zahl 0x01020304 wird dann wie folgt als 32-Bit-Zahl an den Adressen 1000 bis 1003 gespeichert:

Adresse1000100110021003
Wert0x010x020x030x04

Little Endian speichert das am wenigsten signifikanteste Bit zuerst. Die hexadezimale Zahl 0x01020304 wird dann wie folgt als 32-Bit-Zahl an den Adressen 1000 bis 1003 gespeichert:

Adresse1000100110021003
Wert0x040x030x020x01

Die weitverbreitete x86-Architektur verwendet Little Endian.

Aufgabe

Schreiben Sie ein Programm (in C oder einer anderen Sprache Ihrer Wahl), dass herausfindet, ob ihr Computer Big oder Little Endian verwendet.