Beschreibe in Stichpunkten, was genau bei den Systemcalls open()
und close()
kernelintern abläuft!
Dabei sollten auch Begriffe wie namei()
,
inode table,
file table,
user filedescriptor table und reference
counter erscheinen.
Aufgabe 2 (theoretisch, 1 Punkt)
Wieso hat man beim Entwurf von Unix extra eine globale FileTable angelegt und Informationen wie Read/WriteOffset und Zugriffsmodus nicht einfach in der incore inode table untergebracht?
Aufgabe 3 (theoretisch, 2 Punkte)
Was ist der Unterschied zwischen den ReferenceCounter und dem LinkCounter eines Inodes? Besitzt ein Inode überhaupt ständig beides? Begründung!
Aufgabe 4 (theoretisch, 2 Punkte)
Beschreibe einen Algorithmus "pwd", der das aktuelle Verzeichnis (current
working directory) ausgibt und sich dabei nur der Funktionen stat()
, opendir()
und readdir()
bedient! Denke
bitte auch an die Abbruchbedingung!
Aufgabe 5 (praktisch, 10 Punkte)
Schreibt eine kleine Shell msh
. Zunächst soll die msh nur die nachfolgend
aufgeführten builtinKommandos bereitstellen:
cd dir: Die Shell wechselt zur angegebenen Directory dir. Wenn kein Parameter angegeben ist, soll zur home directory gewechselt werden.
pwd: Der Pfad der current directory ist anzuzeigen.
la names: Die Files und Directories
in Analogie zum Kommando ls -la
sind
auszugeben.
names können ein oder mehrere Files
oder Directories sein, der Parameter kann aber
auch ganz fehlen.
In letzterem Fall sind die Dateien der current directory
anzuzeigen.
Die Filenamen brauchen nicht sortiert zu werden,
jedoch soll für Directories am Ende die Summe der
Dateigrößen in Bytes ausgegeben werden.
(Aber nur für das Verzeichnis und nicht für alle
Unterverzeichnisse!)
Benutzt die in der letzten Aufgabe implementierten Routinen
parseline()
und readline()
.
Als Erweiterung sind die CQuelldateien builtin.c
,
prompt.c
und ls.c
zu schreiben.
builtin.c
soll die Funktion do_builtin()
das ihr übergebene Kommando mit den builtinKommandos vergleichen und ggf.
ausführen.
Als Rückgabewert wird der Wert 1 geliefert,
wenn es sich bei dem Kommando um ein builtinKommando handelt,
ansonsten 0.
prompt.c
ist die Funktion
show_prompt()
zu implementieren,
die den aktuellen Prompt auf der Standardausgabe anzeigt.
Die Funktion show_prompt()
liefert keinen
Rückgabewert.
Das genaue Aussehen des Prompts bleibt Euch
überlassen, es müssen aber mindestens die aktuelle Uhrzeit und der
letzte Teil des Pfadnamens der CWD enthalten sein.
ls.c
soll die Funktion do_ls()
das
builtinKommando la
beschreiben.
Die Funktion do_ls()
liefert keinen Rückgabewert.
builtin.c: int do_builtin (struct kommando *kp) prompt.c: void show_prompt () ls.c: void do_ls (struct kommando *kp)In der Datei
main.c
ist wiederum die Testumgebung
für die implementierten Module zu schreiben.
Wenn es sich bei einem Kommando nicht um ein builtinKommando handelt,
ist eine geeignete Fehlermeldung auszugeben.
Beispiel:
[3:00am] [.../ueb/ueb5] > la /bin/builtin.c ; cd .. [3:01am] [.../foo/ueb] > ls msh: Command not found. [3:02am] [.../foo/ueb] > cd ; la ueb/ueb5 [3:02am] [.../f/foo] > exitDer TildeOperator braucht nicht implementiert zu werden. Die Funktionen
ftw()
und scandir()
sollen
nicht benutzt werden.