Hallo,
ich erzeuge einen Kindprozess mittels fork() und einer exec() Funktion.
Erzeuger und Kindprozess laufen über längerem Zeitraum parallel.
Nun soll der Elternprozess mittels waitpid() und WNOHANG hin und wieder
prüfen ob sein Kind abgeschmiert ist. Falls ja, dann soll er das Kinder
wieder erzeugen.
Ich wollte folgendermaßen vorgehen:
if (waitpid(child_pid, 0, WNOHANG) == 0)
{
/* erzeuge neues Kind */
}
Das klappt so leider nicht ganz. Es werden mehrere Kinder erzeugt...
Wie sollte ich vorgehen?
mfg
Stefan Ernst schrieb:> on success, returns the process ID of the child whose state has changed;> if WNOHANG was specified and one or more child(ren) specified by pid> exist,> but have not yet changed state, then 0 is returned. On error, -1 is> returned.
Was ist mit "changed state" gemeint?
Kann ich mit dem Rückgabewert von waitpid überhaupt feststellen ob mein
Kind ein Zombie ist?
> Findest du nicht, es könnte vielleicht eine gute Idee sein, sich die> Doku der Funktion, die man benutzen will, mal durchzulesen?
Ja das habe ich auch getan. Allerdings schein ich da etwas falsch
verstanden zu haben. Bzw. es klappt nicht so wie ich es mir gedacht
habe.
> A state change is considered to be: the child terminated;> the child was stopped by a signal; or the child was resumed by a signal.
Worauf wird denn diese Änderung bezogen?
Auf der letzten waitpid Abfrage?
> Kann ich mit dem Rückgabewert von waitpid überhaupt feststellen ob mein> Kind ein Zombie ist?
Erzeuge ich ein Kind, liefert waitpid eine null zurück.
Schmiert der Prozess ab liefert waitpid die PID zurück.
Richtig?
Wird der Zombie dann automatisch gekillt, oder muss ich das behandeln?
eventuell ist es einfacher sich einfach benachrichtigen zu Lassen wenn
das Kind stirbt.
http://de.wikipedia.org/wiki/Zombie_(Informatik)
Der Kernel sendet an den Elternprozess ein spezielles Signal, nämlich
SIGCHLD, sobald eines seiner Kinder beendet wird. Im Handler für dieses
Signal ist die Statusabfrage des Kindprozesses durchzuführen, damit er
endgültig verschwindet. Geschieht dies nicht oder wird überhaupt kein
Handler für SIGCHLD angegeben (in diesem Fall wird das Signal einfach
ignoriert), verbleibt das Kind im Zombie-Zustand in der Prozesstabelle.
123456 schrieb:>> Findest du nicht, es könnte vielleicht eine gute Idee sein, sich die>> Doku der Funktion, die man benutzen will, mal durchzulesen?>> Ja das habe ich auch getan.
Warum stellst du dann dauernd Fragen, die dort beantwortet sind?
>> A state change is considered to be: the child terminated;>> the child was stopped by a signal; or the child was resumed by a signal.>> Worauf wird denn diese Änderung bezogen?
Für stop und resume ist das ja noch eine sinnvolle Frage, aber dich
interessiert ja nur, ob der Prozess beendet wurde, und da beendete
Prozesse selten spontan wieder zurückspringen auf laufend, dürfte die
Antwort in deinem Fall klar sein: Auf Erzeugung des Prozesses.
> Erzeuge ich ein Kind, liefert waitpid eine null zurück.
Sofern du es mit WNOHANG aufrufst und es keinen Fehler gibt, ja.
> Schmiert der Prozess ab liefert waitpid die PID zurück.
Er könnte "abgeschmiert" sich, sich regulär beendet haben oder durch ein
Signal beendet worden sein. Das kann man aber noch separat abfragen.
> Wird der Zombie dann automatisch gekillt, oder muss ich das behandeln?
1
In the case of a terminated child, per‐
2
forming a wait allows the system to release the resources associated
3
with the child; if a wait is not performed, then the terminated
4
child remains in a "zombie" state (see NOTES below).