Kindprozess überwachen mit waitpid()

Gast #3594614
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
#3594690
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.
Gast #3594779
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?
Gast #3595157
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?
Gast #3595200
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.
Gast #3595368
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).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.