TUD Logo

TUD Home » ... » Teaching » Operating Systems and Security » Unix

Operating Systems

Exercise: Unix

Unix

Geplante Bearbeitungszeit: drei Wochen

Part I. Grundlegende praktische Aufgaben

Der praktische Teil der Übung soll allen Studenten, die bisher noch keine Erfahrungen mit Unix-artigen Systemen – wie dem im Rechenzentrum bereitgestellten „Ubuntu“ – gesammelt haben, den Umgang mit einem solchen näher bringen. Die Beantwortung der konkreten Fragen steht dabei nicht im Vordergrund, sie sind vielmehr als Anregung zu verstehen sich mit den typischen Arbeitsweisen in einem Unix-System vertraut zu machen. Insofern ist es nicht zielführend die Fragen allein mittels Recherche im Internet zu beantworten.

1. Aufgabe:

Diese Aufgabe macht Sie mit der Benutzung von Unix-Hilfeseiten („Manpage“, kurz für „manual page“) mit Hilfe des Kommandos man vertraut. Veranschaulichen Sie sich bei c) bis e) Ihre Antworten durch eigene Beispiele. Zum Nachvollziehen der Kommandozeilen-Aufrufe können Sie u. a. auch http://explainshell.com nutzen.
  1. Wie kann man allgemein die Manpage zu einem Shell-Kommando aufrufen? Wie lautet speziell der Aufruf, um sich über Aufbau und Inhalt von Manpages zu informieren? Durch welche Eingabe wird die Anzeige einer Manpage beendet (und damit die Rückkehr zur Shell möglich)?\begin_inset Separator latexpar\end_inset
  2. Die Unix-Manpages sind in Abschnitte eingeteilt. Welche Abschnitte gibt es und wie greift man darauf zu?\begin_inset Separator latexpar\end_inset
  3. Welche man-Option zeigt Kurzbeschreibungen von Manpages auf der Kommandozeile an?\begin_inset Separator latexpar\end_inset
  4. Welche Option von man durchsucht die Kurzbeschreibungen aller im System verfügbaren Manpages nach einem bestimmten Begriff?\begin_inset Separator latexpar\end_inset
  5. Benutzen Sie die Manpages der entsprechenden Kommandos, um die nachfolgenden Fragen zu beantworten:\begin_inset Separator latexpar\end_inset
    • Mit dem Kommando ls kann man sich den Inhalt eines Verzeichnisses anzeigen lassen.\begin_inset Separator latexpar\end_inset
      • ls zeigt standardmäßig versteckte Dateien (deren Namen mit einem Punkt beginnen) nicht an. Wie kann man dieses Verhalten ändern? Wie lassen sich zusätzlich alle Dateien im ausführlichen Format (d. h. mit Rechten, Größe usw.) anzeigen?
      • Wie kann man sich die Dateien der Größe nach geordnet anzeigen lassen?
      • Auf welche Weise kann man die Dateigröße in einem leichter lesbaren Format (mit Einheiten für Byte, KByte und MByte) anzeigen?
    • Welche Header-Dateien müssen eingebunden werden, um den open()-Systemaufruf verwenden zu können? Was sind mögliche Rückgabewerte von open() und welche Fehler können beim Aufruf von open() auftreten?\begin_inset Separator latexpar\end_inset
    • Mit dem Befehl cd kann man das aktuelle Arbeitsverzeichnis wechseln. Warum muss cd durch die Shell selbst bereitgestellt werden und kann nicht als separates Programm implementiert sein? Welche zusätzlichen Optionen unterstützt cd?\begin_inset Separator latexpar\end_inset

2. Aufgabe:

Zum besseren Verständnis der nachfolgenden Aktivitäten können Sie sich den im Laufe der Aufgabe entstehenden Verzeichnisbaum aufzeichnen und sich vergegenwärtigen, in welchem Verzeichnis Sie sich jeweils befinden.
  1. Legen Sie in Ihrem Home-Verzeichnis ein Verzeichnis namens mydir an. Wechseln Sie in dieses Verzeichnis und erzeugen Sie mittels touch myfile eine (leere) Datei myfile. Zeigen Sie die ausführlichen Informationen über diese Datei an.\begin_inset Separator latexpar\end_inset
    Hinweis: Das Kommando mkdir erzeugt ein neues Verzeichnis, cd ermöglicht den Wechsel des Arbeitsverzeichnisses und die Kommandos ls und stat zeigen Datei-/Verzeichnis-Informationen an.
  2. Kehren Sie in Ihr Home-Verzeichnis zurück. Legen Sie ein weiteres Verzeichnis mit dem Namen yourdir an und informieren Sie sich über den ausführlichen, vollständigen Inhalt Ihres Home-Verzeichnisses.\begin_inset Separator latexpar\end_inset
  3. Erzeugen Sie in dem Verzeichnis yourdir mit Hilfe des Kommandos ln einen Hardlink yourfile, der auf myfile zeigt. Zeigen Sie den ausführlichen Inhalt der Verzeichnisse mydir und yourdir an. Worin unterscheiden sich diese Inhalte? Worin unterscheidet sich der jetzige Zustand von myfile gegenüber dem ursprünglichen Zustand nach a)? Erklären Sie die Ergebnisse.\begin_inset Separator latexpar\end_inset
  4. Mit dem Kommando cat und den beiden Formen der Ausgabeumlenkung > und >> ist es möglich, einzelne Wörter direkt in eine Datei zu schreiben. Die Wörter werden jeweils durch einen Zeilenumbruch getrennt, die gesamte Eingabe wird mit Strg+d beendet. Untersuchen Sie die Wirkung der beiden Eingabeumlenkungen, indem Sie im Verzeichnis mydir eine Datei test erzeugen und in diese Datei in der beschriebenen Weise mehrmals schreiben. Informieren Sie sich jedes Mal über den Inhalt der Datei (z. B. mit dem Kommando cat). Löschen Sie am Ende die Datei test (Kommando: rm).\begin_inset Separator latexpar\end_inset
  5. Fügen Sie folgende Wörter abwechselnd in die Dateien myfile und yourfile ein: thread, process, task, memory, TLB. Was beobachten Sie beim Betrachten der Inhalte beider Dateien?\begin_inset Separator latexpar\end_inset
  6. Vergewissern Sie sich, in welchem Verzeichnis Sie sich befinden; wechseln Sie ggf. in das Verzeichnis mydir. Suchen Sie in der Datei myfile nach allen Zeilen, die den Buchstaben t enthalten; sortieren Sie das Ergebnis alphabetisch absteigend und geben Sie die erste Zeile aus.\begin_inset Separator latexpar\end_inset
    Hinweis: Das Kommando grep durchsucht Inhalte von Dateien, sort sortiert Zeilen, und das Kommando head beschränkt eine Liste auf eine Anzahl von Zeilen. Nutzen Sie Pipes zum Verknüpfen von Befehlen.
  7. Welche beiden Möglichkeiten haben Sie, in einem Schritt (also durch einmalige Anwendung von cd) in das Verzeichnis yourdir zu wechseln? Wählen Sie eine davon aus und überzeugen Sie sich vom Erfolg. Ändern Sie Ihr eigenes Zugriffsrecht für die Datei yourfile auf „nur-lesend-zugreifbar“. Versuchen Sie nun, in die Datei myfile zu schreiben. Erklären Sie den Effekt.\begin_inset Separator latexpar\end_inset
    Hinweis: Zur Änderung von Zugriffsrechten kann das Kommando chmod verwendet werden.
  8. Legen Sie ein Verzeichnis somedir an und wechseln Sie in dieses Verzeichnis. Kopieren Sie die Datei myfile in dieses Verzeichnis. Überprüfen Sie den Inhalt der Datei yourfile.\begin_inset Separator latexpar\end_inset
  9. Zeigen Sie den ausführlichen Inhalt des aktuellen Verzeichnisses an. Wieso hat der Link-Zähler der Datei myfile den Wert 1, obwohl es diese Datei in Ihrem Verzeichnisbaum zweimal gibt?\begin_inset Separator latexpar\end_inset
  10. Löschen Sie die Datei myfile zunächst in somedir und anschließend in mydir. Untersuchen Sie jeweils die Eigenschaften von yourfile und erklären Sie die Veränderungen.\begin_inset Separator latexpar\end_inset
Zusatzaufgabe: Führen Sie die oben beschriebenen Schritte durch, aber verwenden Sie einen symbolischen Link (der gleichfalls durch ln erzeugt werden kann) statt eines Hardlinks.

3. Aufgabe:

Vollziehen Sie die in der Vorlesung vorgeführten Beispiele zur Programmentwicklung und zu Grundlagen von Unix nach. Versuchen Sie nach Möglichkeit alle damit verbundenen Vorgehensweisen, Informationen und Systemaktivitäten zu erklären.
Hinweis: Die C-Programme stehen im Internet bereit und können mit den folgenden Befehlen in Ihr aktuelles Verzeichnis geladen werden:

wget https://os.inf.tu-dresden.de/Studium/Bs/hello1.c

wget https://os.inf.tu-dresden.de/Studium/Bs/hello2.c

wget https://os.inf.tu-dresden.de/Studium/Bs/hello3.c

4. Aufgabe:

Informieren Sie sich anhand der Manpages über die folgenden Systemaufrufe:
  fork(), execve(), exit(), wait(), waitpid()
Machen Sie sich im Hinblick auf die theoretischen Übungen (Aufg. 11, 12, 13) mit Format, Wirkungsweise und wichtigen Eigenschaften dieser Systemaufrufe vertraut.


Part II. Theoretische Aufgaben

5. Aufgabe:

Erläutern Sie die einzelnen Schritte des Übergangs von einem (gedanklich oder schriftlich vorliegenden) Algorithmus über die Implementierung in C bis hin zu einem lauffähigen Programm. Geben Sie dazu jeweils folgende Informationen an:
  • Schritt bzw. ausführendes Programm
  • Programmname in Unix
  • Ergebnis (Bezeichnung und Art der erzeugten Datei, Beschreibung ihres Inhalts)
  • Dateiendung unter Unix

6. Aufgabe:

In der Vorlesung wurde die Adressraumstruktur von Unix eingeführt. Ordnen Sie für das links stehende Beispiel die in der Tabelle enthaltenen Symbole demgemäß ein.
​
#include <stdlib.h>
int a[20];
int x = 1;
void foo(void) {
  int b[20];
  void *p = malloc(100);
  free(p);
}
Text Data BSS Heap Stack
a
x
foo
b
p
*p

7. Aufgabe:

Welche der folgenden Funktionen müssen im Kern, welche können im Nutzermodus implementiert werden (Mehrfachzuordnungen möglich). Begründen Sie Ihre Entscheidung.
(a) (b) (c) (d) (e) (f) (g)
Kern
Nutzer
  1. qsort() – Sortieren eines Feldes
  2. memcpy() – Kopieren von Daten
  3. open() – Öffnen einer Datei
  4. copyin() – Kopieren von Daten aus dem Nutzeradressraum in den Kernadressraum
  5. set_pte() – Eintragen einer Seite in die Seitentabelle und damit Einblenden von Speicher in einen Adressraum (Adressräume sind eines der wesentlichen Schutzkonzepte des Betriebssystems)
Innerhalb welcher Bereiche treten die folgenden Intel-Maschinenbefehle normalerweise auf?
  1. movl $3, %eax – Laden des frei verwendbaren Registers („general purpose register“) eax mit 3
  2. movl %eax, %cr3 – Laden des Spezialregisters cr3 und damit Umschalten auf einen anderen Adressraum

8. Aufgabe:

In Unix hat jedes Programm standardmäßig drei Dateien geöffnet: stdin, stdout und stderr. Weshalb ist ein separater Kanal für Fehlermeldungen (stderr) sinnvoll, wenn doch bereits stdout existiert?

9. Aufgabe:

Welche Voraussetzungen muss ein Programm erfüllen, das in einer Kommandosequenz wie ls | grep ps | sort verwendet werden soll, oder anders gefragt, warum kann das Beispiel latex foo.tex | dvips | lpr so nicht funktionieren? Informieren Sie sich zuvor mit Hilfe der Manpages über die Funktionalität der auftretenden Kommandos.

10. Aufgabe:

In der Vorlesung wurde der Systemruf unlink() zum Löschen einer Datei erwähnt. Was geschieht beim Ausführen der folgenden Codesequenz?

int fd = creat("/tmp/test", S_IRWXU);

unlink("/tmp/test");

write(fd, "Hello world\n", 12);

close(fd);

Wann wird die Datei test gelöscht und ist damit für andere nicht mehr sichtbar? Kann write() erfolgreich abgeschlossen werden? Was geschieht beim Aufruf von close()?

11. Aufgabe:

C-Programme werden unter Unix – direkt oder indirekt – mit exit(result) beendet, wobei ein Resultat übergeben werden kann. Was geschieht mit diesem Resultat und wie kann man es abfragen?

12. Aufgabe:

Entwerfen Sie ein Bild, das den Ablauf beim Starten eines Programms durch die Shell darstellt und die Rolle von fork(), execve(), wait(), exit() veranschaulicht. Erläutern Sie dabei auch den Prozessstatus „Zombie“, in dem der Prozess nur noch einige hundert Bytes an Ressourcen belegt und ansonsten nichts mehr tut. Wie kommt ein Prozess in diesen Status und was kann man tun, um ihn aus diesem Status herauszuholen?

13. Aufgabe:

  1. Erklären Sie, warum nach fork() parent und child zum einen an der gleichen Stelle des Programms fortgesetzt werden, zum anderen dann aber unterschiedliche Wege gehen können.
  2. Welche Ressourcen werden von parent und child gemeinsam genutzt?
  3. Kann das folgenden Programmstück zu verschiedenen Ergebnissen führen?\begin_inset Separator latexpar\end_inset
    Begründen Sie Ihre Antwort und nennen Sie das Ergebnis bzw. einige Ergebnisse. Dabei bewirkt puts() die unformatierte zeilenweise Ausgabe der als Parameter angegebenen Zeichenkette.
    
    
    int i, pid = fork();
    
    
    if (pid < 0) {
    
    
    perror("Error during fork()");
    
    
    exit(1);
    
    
    }
    
    
    if (pid) {
    
    
    for (i = 0; i < 4; i++)
    
    
    puts("parent");
    
    
    } else {
    
    
    for (i = 0; i < 4; i++)
    
    
    puts("child");
    
    
    }
    
    
  4. Wieso kann i in beiden Prozessen benutzt werden, ohne dass sich die beiden Prozesse beeinflussen?

14. Aufgabe:

Welche Reaktionsmöglichkeiten auf Signale gibt es in Unix? Was muss man tun, um von der Standardreaktion auf eine andere Reaktion zu wechseln? Gibt es Signale, für die keine Abweichung von der Standardreaktion möglich ist? Wenn ja, welche?


Part III. Vertiefende praktische Aufgaben

Dieser Teil der Übungsaufgaben zur individuellen Bearbeitung durch fortgeschrittene Studenten gedacht und wird nicht in den Übungsgruppen behandelt. Die Übungsleiter beantworten aber natürlich gern Fragen zu den Aufgaben.

15. Aufgabe:

Das bereitgestellte tar-Archiv (entpacken mit tar xzf seminar.tar.gz, übersetzen mit make) enthält den Rahmen für eine Shell, die eine recht einfache Kommandosyntax der folgenden Form hat:
   command [arg1 ... arg9] [< input_redirect] [> output_redirect] [| command2 ... ] [&]
Die Shell liest Eingaben und zerlegt sie in ihre Bestandteile. Am Ende der Eingabe ruft sie eine Funktion execute_command_line() auf, die die Ausführung der eingegebenen Kommandos veranlassen soll.
  1. Schreiben Sie eine einfache Version von execute_command_line(), die lediglich das erste Kommando ausführt und dabei das in Aufgabe 13 entworfene Ablaufschema mit fork(), execve() und wait() umsetzt.
  2. Ergänzen Sie die Funktion derart, dass eine eingegebene Umleitung der Ein- oder Ausgabe durchgesetzt wird. Sehen Sie sich dazu die Beschreibung der Funktionen open(), dup2() und close() an!
  3. Ergänzen Sie die Funktion so, dass eine Pipe-Sequenz der Art ls | more korrekt ausgeführt wird. Studieren Sie dazu den pipe()-Systemruf an und überlegen Sie, wie mit seiner Hilfe die Ausgabe eines Prozesses zur Eingabe eines anderen Prozesses werden kann.

16. Aufgabe:

Das Unix-Programm find sucht Dateien, die bestimmte Bedingungen erfüllen. Implementieren Sie ein kleines find-Programm, das folgende Syntax akzeptiert:
   find <path> -name <name> -type <f|d>
Sind die Bedingungen erfüllt, wird der Name der Datei bzw. des Verzeichnisses ausgegeben. Sehen Sie sich dazu die Funktionen der Familie readdir() und stat() an.
Last modified: 15th Oct 2018, 11.24 AM
Author: Dipl.-Inf. Jan Bierbaum

Contact
Sorry — there was an error in gathering the desired information

Regulations
  • ModuleModules: INF-B-380, INF-LE-EUI
  • 4/2/0 = 6 SWS
Time and Place
  • Lecture, weekly
    TimeTue, 9.20 AM PlaceHSZ 0004
  • Lecture, weekly
    TimeFri, 9.20 AM PlaceHSZ 0003
Mailing List