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.
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.
.
und ..
können verwendet werden, um auf das aktuelle und das übergeordnete Verzeichnis zu referenzieren.
/home/smith/foo/bar
zu verweisen, wenn das cwd /home/smith/foo
ist.
Auf einem modernen Betriebssystem laufen mehrere Programme gleichzeitig in verschiedenen Prozessen. Wenn ein Prozess gestartet wird, assoziiert das Betriebssystem (u.a.) die folgenden Eigenschaften:
getpid
zugreifen.getuid
zugreifen.getcwd
zugreifen.LC_ALL
⇒ de_DE.UTF-8
). Umgebungsvariablen können das Verhalten des Programmes verändern. Zum Beispiel kann mit der Umgebungsvariablen LC_ALL
die Lokalisierung (Sprache) geändert werden. C-Programme können darauf mittels der Variable environ
zugreifen.--help
ist. In C kann man darauf mit den Argumenten der main-Methode (argv
und argc
) darauf zugreifen, in Java mit dem args-Argument der main-Methode, in Python mit sys.argv
.stdin
(Eingabekanal, Nummer 0). Normalerweise die Eingaben des Benutzers.stdout
(Ausgabekanal, Nummer 1). Für Programmausgaben gedacht.stderr
(Ausgabekanal, Nummer 2). Für Fehlermeldungen.
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.
Schreiben Sie ein Programm, das alle oben erwähnten Eigenschaften auf stdout
ausgibt.
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:
/bin/ls
kann die ausführbare Datei ls
im Verzeichnis /bin
ausgeführt werden. ls zeigt den Inhalt des aktuellen Verzeichnisses an.PATH
gesucht. Darum kann man z.B. einfach ls
eingeben, wenn der PATH
/usr/bin:/bin:/usr/local/bin
ist.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.
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:
Adresse | 1000 | 1001 | 1002 | 1003 |
---|---|---|---|---|
Wert | 0x01 | 0x02 | 0x03 | 0x04 |
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:
Adresse | 1000 | 1001 | 1002 | 1003 |
---|---|---|---|---|
Wert | 0x04 | 0x03 | 0x02 | 0x01 |
Die weitverbreitete x86-Architektur verwendet Little Endian.
Schreiben Sie ein Programm (in C oder einer anderen Sprache Ihrer Wahl), dass herausfindet, ob ihr Computer Big oder Little Endian verwendet.