Fragebogen zu Unix­1

C

1.
Welchen Wert hat die Variable loop nach Beendigung der Schleife?  Begründe Deine Antwort!
  char i; unsigned char j = 128; short loop;
  for (loop = 0, i = j; i > 0; i­­) loop++;

2.
Welche Ausgabe erscheint auf der Standard­Ausgabe?  Begründe Deine Antwort.
  unsigned int i = ­1;
  printf ((i < 0) ? "negativ" : "positiv")

3.
Warum führt der Aufruf der Funktion strcat() hier zu einem Laufzeitfehler?
  char cprog[] = "parser";
  strcat (cprog, ".c");

4.
Welche Laufzeitfehler weist die folgende Prozedur auf?  Korrigiert die Fehler.
char *getfilename(char *fn) {
   char *buf;
   sprintf (buf, "/tmp/%s.c", fn);
   return buf;
}

5.
Worin unterscheiden sich die folgenden Expressions?  Wie müssen die Variablen deklariert sein?
  x = "3"; y = '3'; z = 3;

6.
Was ist der Unterschied zwischen einer Bibliotheksfunktion und einem Systemcall?

Filesystem

7.
Wodurch ist die maximale Anzahl von Files auf einem Filesystem beschränkt?

8.
Warum liefert die Funktion getchar() einen Rückgabewert vom Typ int ?

9.
Erläutere den Unterschied (wenn es einen gibt) zwischen einem Filedeskriptor und einem File­Pointer!

10.
Wie kann man in einem C­Programm zu einem bekannten Filedeskriptor die Größe der Datei ermitteln?

11.
Wodurch ist die Größe einer Datei beschränkt? Nenne mindestens drei Gründe!

12.
Wozu dienen die Einträge . und .. in einer Directory?

13.
Welche Zugriffsrechte hat der Benutzer volli der Gruppe kbs auf die Datei README ?
-r---w---x 1      volli      kbs      1 Dec 1 06:01 README

14.
Warum sieht man, wenn man das Kommando "ls -ld" auf eine Directory anwendet niemals weniger als zwei links?

15.
Das Verzeichnis ,,unix1'' enthält die Dateien ,,msh'' und ,,parser.h'' sowie die Unterverzeichnisse ,,ueb1'', ,,ueb2'' und ,,ueb3''. Wie hoch ist der link count im Inode von ,,unix1'' und wie kommt er zustande?

16.
Wieso werden ,,freie`` Datenblöcke zu einer Liste verkettet?  Wieso ist das bei Inodes nicht nötig?

17.
Auf einer Festplatte befinden sich ,,Bad Blocks`` (physikalische Blöcke, die nicht gelesen bzw. geschrieben werden können).  Der Controller verwaltet diese Bad Blocks nicht intern.  Es soll jetzt ein Filesystem auf der Festplatte angelegt werden.  Welche Auswirkung hat es, wenn diese Bad Blocks in der Inode­Liste bzw. in den Datenblöcken liegen?  Welche Möglichkeiten bestehen, diese Bad Blocks zu verwalten, ohne daß sie zu einem Schaden im Filesystem führen?

18.
Wieso sind Hardlinks nur innerhalb eines Filesystems möglich?  Wieso ist das bei Softlinks nicht der Fall?

19.
Angenommen, ein Benutzer hat eine besondere Version des System V UNIX­Systems. Der einzige Unterschied dieser Version zu der ,,normalen`` ist, daß ein Directory­Eintrag 32 Byte groß ist.  Der Directory­Eintrag gliedert sich in 2­Byte­Inode­Nummer und 30­Byte­Filenamen.  Ein von dieser Version erzeugtes Filesystem wird jetzt in den Filebaum eines normalen System V Unix gemounted.  Welche Probleme entstehen?  Wie könnten diese Probleme behoben werden?

20.
Nenne sinnvolle Anwendungen für das Set­Uid­ und Set­Gid­Bit.

21.
Auf einem UNIX­System V Filesystem ist der Superblock aus irgendeinem Grund überschrieben worden.  Welche Informationen sind verloren gegangen?  Welchen Schaden hat das Filesystem dadurch genommen?  Kann das Filesystem wieder repariert werden?  Wie kann man z.B. die Liste der freien Datenblöcke wiederherstellen?  Welche Informationen sind dazu mindestens notwendig?  Begründung!

Filesubsystem

22.
Beschreibe den Algorithmus der internen Kernelfunktion namei, bei dem ,,gemountete`` Filesysteme beachtet werden.

23.
Beschreibe die Verwendung und Unterschiede der Inodes auf der Festplatte und im Hauptspeicher!

24.
Wieso hat man beim Entwurf von Unix extra eine globale File Table angelegt und Informationen wie Read­Write­Offset und Zugriffsmodus nicht einfach in der Incore Inode Table untergebracht?

25.
Was ist der Unterschied zwischen dem Reference Counter und dem Link Counter eines Inodes?  Besitzt ein Inode überhaupt ständig beides?  Begründung!

26.
Schreibe ein kleines C­Programm, das alle Filenamen einer Directory ausgibt.

27.
Was muß beim ,,unmounten`` von Filesystemen bezügl. des Buffercaches und des Inode Caches beachtet werden?

28.
Wie unterscheiden sich die Funktionen fstat(), stat() und lstat() ?

29.
Was passiert beim lseek()­Systemcall?

30.
Schreibe eine kleines C­Programm (pwd), daß die aktuelle Working­Directory des Prozesess ausgibt mit Hilfe der Funktionen stat(), opendir() und readir().

Prozeßverwaltung

31.
Welche Zustände kann ein Prozeß zwischen seiner Erzeugung und seinem endgültigen Verschwinden aus dem System durchlaufen? Welche Gründe liegen bei den Übergängen zwischen den einzelnen Zuständen vor?
Mehr über Unix­Prozeßzustände...

32.
Welches Problem ergäbe sich, wenn der Sohn­Prozeß bei dem fork() ­Systemcall die Prozeß­ID des Vaters zurückerhalten würde und der Vater die Prozeß­ID 0?

33.
Welche Auswirkung hätte es, wenn der init­Prozeß nicht die Söhne adoptieren würde, die keinen Vater mehr haben?

34.
Was passiert mit einem Prozeß, der den _exit()­Systemcall ausführt?

35.
Aus welchen Segmenten setzt sich ein Unix­Prozeß zusammen und welche Bedeutung haben diese?

36.
Der Unix­Kern erreicht die User­Structure des gerade aktiven Prozesses einfach durch Ansprechen der kernglobalen Variablen u (z.B. u.u_error = ENOMEM).  Wie ist es möglich, daß der Kern so immer die richtige User­Structure trifft?  Was passiert in diesem Zusammenhang bei einem Prozeßwechsel?  Wie sieht der Adreßraum eines laufenden Prozesses in etwa aus?

37.
Wieviele Prozesse können maximal im System existieren?

38.
Wie erhält die globale Varibale errno den Fehlerwert nach einem gescheiterten Systemcall?  Beschreibe den genauen Ablauf.

39.
Welche Auswirkung hätte es, wenn ein Prozeß unter Unix sein Text­Segment manipulieren könnte?  Was müßte beachtet werden?

40.
Angenommen, ein Rechnersystem besitzt keine MMU, mit der man virtuelle Adreßräume aufbauen kann.  Welches Problem entsteht, wenn auf solch einem System Programme gestartet werden sollen, bei denen die Adressen für Variablen und Funktionen immer ab dem Offset Null beginnen?

41.
Wann wird der Verweis von der proc­structure auf die u­area benötigt?

42.
Warum ist der Kernel­Stack ,,leer``, wenn sich der Prozeß im Status user running befindet?

43.
Auf welche der folgenden Datenstrukturen hat ein Prozeß A schreibenden Zugriff, wenn er sich im Zustand user running bzw. kernel running befindet:

Prozeßkontrolle

44.
Wieso existiert kein Programm cd in einem UNIX­System? Warum ist das Kommando cd als builtin­Kommando in der Shell implementiert?

45.
Was macht folgendes Programm:
main (int ac, char **av, char **ev) {
        execve (av[0], av, ev);
}

46.
Schreibe ein kleines C­Programm, das das Programm /bin/ls ausführt und die Standardausgabe auf das File /tmp/out umlenkt.

47.
Wenn ein Programm ,,abstürzt``, erscheint je nach Fehlerursache auf dem Terminal die Fehlermeldung ,,bus error``, ,,segmentation fault`` oder ,,illegal instruction``.  Diese Meldung wird von der Shell ausgegeben.  Wieso kann die Shell diese Meldung ausgeben, woher weiß die Shell, daß das Programm einen ,,segmentation fault`` oder eine ,,illegal Instruction`` ausgelöst hat?

48.
Was ist der Unterschied zwischen der Bibliotheksfunktion exit() und dem Systemcall _exit()?

49.
Was ist ein Zombie­Prozeß?  Welchen Sinn haben Zombie­Prozesse?

50.
In welchen Datenstrukturen werden die Referenz­Zähler bei einem fork(), einem execve(), einem _exit() und einem dup()­Systemcall verändert.  Begründe Deine Anwort.

51.
In welchen Fällen ist der reference count von einem inode größer als 1?

52.
Angenommen, der Teil der Shell, der Prozesse ausführt und dabei die Standardausgabe umlenkt, ist folgendermaßen implementiert:
do_exec (char *path, char **av, char **ev, char *output) {
   if ((fd = creat (output, 0666)) < 0)
           return (­1);
   switch (fork()) {
   case 0: 
           if (dup2 (1, fd) < 0)
                   return (­1);
           execve (path, av, ev);
   case ­1:
           return (­1);
   default:
           wait (0);
   }
}
Was ist an dieser Implementierung nicht korrekt?  Was passiert nach einigen Aufrufen?

53.
Welche Rollen spielen die real­ und effective User­ID eines Prozesses?

Zur Unix­1 Homepage                                    Jutta Degener, 6. Dezember 1994