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
>Wie sollte ich vorgehen?
Eine ordentliche Fehlerbeschreibung liefern
1 | if (waitpid(child_pid, 0, WNOHANG) == 0) |
2 | {
|
3 | /* erzeuge neues Kind */
|
4 | }
|
1 | waitpid(): |
2 | on success, returns the process ID of the child whose state has changed; |
3 | if WNOHANG was specified and one or more child(ren) specified by pid exist, |
4 | but have not yet changed state, then 0 is returned. On error, -1 is returned. |
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?
123456 schrieb: > Was ist mit "changed state" gemeint?
1 | A state change is considered to be: the child terminated; |
2 | the child was stopped by a signal; or the child was resumed by a signal. |
Findest du nicht, es könnte vielleicht eine gute Idee sein, sich die Doku der Funktion, die man benutzen will, mal durchzulesen?
> 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). |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.