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)Was ist an dieser Implementierung nicht korrekt? Was passiert nach einigen Aufrufen?{ 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); } }
Aufgabe 2 (theoretisch, 2 Punkte)
Welche Rollen spielen die real und effective UserID eines Prozesses? Beschreibe eine praktische Anwendung des SetUIDBits!
Aufgabe 3 (theoretisch, 1 Punkt)
Nenne mindestens drei Möglichkeiten, wie ein Prozeß verhindern kann,
daß er bei Eingabe von ^C
am Terminal terminiert!
Aufgabe 4 (theoretisch, 2 Punkte)
Was passiert mit einem Prozeß, der aus einer ,,leeren'' Pipe lesen will? Was ist, wenn der Kommunikationspartner schon terminiert ist? Was geschieht, wenn ein Prozeß bei terminiertem Partner in eine Pipe schreibt?
Aufgabe 5 (theoretisch, 3 Punkte)
Erläutere kurz den Zusammenhang zwischen Terminals, Signalen, Prozeßgruppen, Controlling TTYs und Sessions.
Aufgabe 6 (praktisch, 10 Punkte)
Erweitert Euren Shell msh
um das Umlenken der Ein und Ausgabe in ein
File. Das Auftreten einer pipe soll ebenfalls korrekt behandelt werden.
Um auf die Termination von Hintergrundprozessen warten zu können, ist das
builtinKommando wait
zu implementieren:
waitWarten auf die Termination eines der Hintergrundprozesse. Anschließende Ausgabe der ProzeßID des terminierten Prozesses.
wait pidWarten auf die Termination des angegebenen Prozesses pid. Erweitert
msh
zusätzlich um die folgende Signalbehandlung:
msh
soll die Signale SIGINT
, SIGQUIT
und SIGTSTP
ignorieren,
SIGINT
oder SIGQUIT
abgebrochen,
SIGINT
oder SIGQUIT
nicht abgebrochen und
SIGINT
oder SIGQUIT
abgebrochen werden.
Erzeugt für jedes zu startende Hintergrundkommando mit der Funktion
setpgrp()
eine neue Prozeßgruppe. Das
Signal SIGINT
kann am Terminal
durch ^C
und das Signal SIGQUIT
durch ^\
erzeugt werden.
Mit dem Kommando stty
kann diese Tastaturbelegung
umdefiniert werden.