Institut für Informatik Lehr- und Forschungseinheit für Kommunikationssysteme und Systemprogrammierung Systempraktikum - Wintersemester 2009/2010
Prof. Dr. Dieter Kranzlmüller |
Blatt 3- Grundlagen III: Prozesserzeugung, Prozessüberlagerung, Pipes |
Abgabedatum theor. Aufgaben | Abgabedatum prakt. Aufgaben | Deadline Projektaufgaben |
---|---|---|
12.11. | 12.11. | - |
Nr. | Übergang | Beschreibung | Beispiel |
... | ... | ... | ... |
2 | Ready ® Running | Scheduler wählt Prozess | Der Prozess mit der höchsten Priorität |
wird zur Ausführung ausgewählt (Priority-Scheduling) | |||
... | ... | ... | ... |
ps l | grep < progname >
in einem anderen Fenster. Dokumentieren Sie Ihre Ergebnisse ausführlich!
kill(childPID, SIGINT);
) genau? Gibt es einen Zusammenhang mit der Entstehung oder Vermeidung von Zombies und/oder Waisen?
sleep()
-Aufrufe) zum Entstehen von Zombies und/oder Waisen bei?
wait(&status);
) genau? Gehen Sie insbesondere auf die Bedeutung der Variablen
status
ein. Informationen hierzu finden Sie in der Manpage der Funktion
wait()
.
Listing 1: |
|
Listing 2: |
|
Listing 3: |
|
Listing 4: |
|
fork()
-Aufrufe tätigt. Die Anzahl n der Schleifendurchläufe soll als Aufrufparameter über die Konsole übergeben werden. Jeder erzeugte Kindprozess (sowie der ursprüngliche Vaterprozess) soll genau einmal seine Parent-Prozess-ID (PPID) ausgeben.
fork()
-Aufruf zunächst einen ersten Kindprozess und anschließend durch einen zweiten
fork()
-Aufruf einen zweiten Kindprozess erzeugt. Achten Sie aber darauf, dass keiner der beiden Kindprozesse seinerseits Kindprozesse erzeugt! (Es sollen also insgesamt genau zwei direkte Kindprozesse vom ursprünglichen Prozess angelegt werden.) Jeder der beiden Kindprozesse soll nun das Programm aus Teilaufgabe a) einmal ausführen (Aufrufparameter n beliebig). Verwenden Sie einen passenden Aufruf aus der Familie der
exec*()
-Familie, um die Überlagerung der Kindprozesse zu realisieren.
getpid()
ihre Prozess-ID auf dem Bildschirm ausgeben. Falls kein Argument über die Kommandozeile übergeben wird, sollen vier Kindprozesse
erzeugt werden. Lassen Sie jeden Kindprozess dann noch fünf Sekunden
pausieren. Geben sie eine Zeichenkette aus, die besagt, welcher Prozess terminiert, bevor dies passiert. Achten Sie darauf, dass die Kindprozesse ihrerseits keine neuen Kindprozesse erzeugen.
Während die Kindprozesse laufen, soll der Elternprozess durch den Systemaufruf
execlp()
das Unix-Kommando
ps lf
in einer Schleife zehn mal mit jeweils zwei Sekunden Pause dazwischen ausführen. Benutzen Sie die Funktion
sleep()
, um die Wartezeiten zu erzeugen. Schreiben Sie getrennte Funktionen für die Aktionen des Elternprozesses und der Kindprozesse.
Bitte denken Sie an ein Makefile!
pipe()
Systemaufruf?