Waitpid schlägt fehl
-
Hallo, ich versuche in meinem Programm mehrere Kindprozesse zu starten und deren Status in meinem Hauptprogramm zu erfragen. Waitpid meldet aber "No child processes", beim abfragen beendeter Kindprozesse.
Ich versuche meinen Code mal soweit zu kürzen, dass alle wichtigen Stellen enthalten und die Übersichtlichkeit gewahrt bleibt.
Sollten wichtige Stellen fehlen, werde ich diese schnellst möglich nachreichen:Kinderzeugung
switch (pid=fork()){ case -1: perror("Fehler bei fork"); return(-1); case 0: do_execvp([...]); abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */ default: plist[listIndex] = p->pid; }
Die pid wird im Anschluss in einem Array gespeichert.
Nach einer beliebigen Anzahl gestarteter Kindprozesse wird folgender Code ausgeführt:int status,w; while(n<listIndex){ p = plist[n]; status=0; w = waitpid(p->pid,&status,WNOHANG|WUNTRACED); if(w==-1){ perror("waitpid fehlgeschlagen\n"); return 1; } if(w==0){ meldung = "running"; id = 0; } else if(WIFEXITED(status)){ meldung = "exit"; id = WEXITSTATUS(status); } else if(WIFSIGNALED(status)){ meldung = "signal"; id = WTERMSIG(status); } else if(WIFSTOPPED(status)){ meldung = "stop"; id = WSTOPSIG(status); } printf("%d\t%s\t%s\t%d\n",p->pid,p->name,meldung,id); printf("w: %d, status: %d\n",w,status); n++; }
Das Resultat:
Läuft ein Prozess noch, so wird der Zustand korrekt angezeigt.
Wird ein beendeter Prozess erfragt, so beendet waitpid mit -1 und dem Fehlercode "No child processes".
Die Ausführung der Programme, sowie die Übermittlung der pid funktionieren fehlerlos. (laufende Programme lassen sich über die pid beenden)Vermutung:
Die beendeten Kindprozesse befinden sich nicht im Zombiestatus, daher liegen keine Informationen mehr über diese vor.
Kann es daran liegen? Oder wo versteckt sich sonst der Fehler?Ps: An Signalen wird, außer einem kurzen Ignorieren von SIGTTOU und einem Behandeln von SIGINT, meines Wissens nichts beeinflusst.
Ich hoffe, ihr könnt mir helfen.
Gruß, Florian
-
snomann schrieb:
switch (pid=fork()){ case -1: perror("Fehler bei fork"); return(-1); case 0: do_execvp([...]); abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */ default: plist[listIndex] = p->pid; }
Was ist denn p? Insbesondere: wo wird das befüllt?