Ich habe ein Programm, das eine Zufallszahl erzeugt, n, dann n-mal eine Schleife.
Bei jeder Iteration wird der Wert von sleeptime
randomisiert und fork aufgerufen. Der untergeordnete Prozess wird für sleeptime
Sekunden inaktiviert und dann mit dem Wert der Indexvariablen beendet.
Das übergeordnete Element wird dann erneut durchlaufen und wartet darauf, dass jeder Prozess beendet wird. Wenn jeder Prozess beendet wird, versuche ich, die PID und die childid des Prozesses auszulöschen, aber da stoße ich in Schwierigkeiten. Die PIDs werden nacheinander gedruckt, und childid bleibt auf 0 stehen.
Was mache ich falsch?
%Vor%Disclaimer, das sind Hausaufgaben (Link hier, kann jederzeit verschwinden) , aber ich habe schon fast alles gemacht. Ich habe nur Schwierigkeiten, diesen einen Aspekt zu begreifen.
Ihr Code wartet auf die PIDs in der Reihenfolge, in der Sie sie in Ihren aufeinanderfolgenden waitpid()
-Aufrufen bereitstellen. Wenn Sie -1
als ersten Parameter stattdessen an waitpid()
übergeben (oder wenn Sie nur wait()
aufrufen), erhalten Sie das erste Kind, über das der Kernel Sie informiert, und nicht das, von dem Sie speziell benachrichtigt wurden Über. Überprüfen Sie den Rückgabewert, um zu sehen, welches Kind es war (oder ob ein Fehler aufgetreten ist).
Der childid
bleibt 0
, weil Sie WTERMSIG
aus dem Wartezustand extrahieren und nicht WEXITSTATUS
.
Zuerst wartet es darauf, dass der erste Prozess beendet wird, und druckt dann die Informationen aus diesem Prozess.
Dann wartet es darauf, dass der zweite Prozess beendet wird, und druckt dann die Informationen aus diesem Prozess.
Dann wartet es darauf, dass der dritte Prozess endet ...
Und Sie fragen sich, warum sie in der richtigen Reihenfolge gemeldet werden?
Übergeben Sie -1 stattdessen an waitpid
. Die Seite besagt, dass sie auf any untergeordneter Thread anstelle eines bestimmten Threads.
Außerdem haben Sie direkt vor dem Drucken int childid = -1;
. Nicht sicher warum.