Forum: Compiler & IDEs Kindprozess überwachen mit waitpid()


von 123456 (Gast)


Lesenswert?

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

von pid (Gast)


Lesenswert?

>Wie sollte ich vorgehen?

Eine ordentliche Fehlerbeschreibung liefern

von Stefan E. (sternst)


Lesenswert?

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.

von 123456 (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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?

von 123456 (Gast)


Lesenswert?

> 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?

von Peter II (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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).

von 123456 (Gast)


Lesenswert?

okay - vielen dank

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
Noch kein Account? Hier anmelden.