In meinem Programm verzweige ich (parallel) untergeordnete Prozesse in einer endlichen while-Schleife und führe sie auf jedem von ihnen aus. Ich möchte, dass der übergeordnete Prozess die Ausführung (der Punkt nach dieser while-Schleife) erst wieder aufnimmt, nachdem alle untergeordneten Prozesse beendet wurden. Wie soll ich das machen?Wartet auf alle untergeordneten Prozesse, bevor der Vater die Ausführung fortsetzt. UNIX
Ich habe mehrere Ansätze ausprobiert. Bei einem Ansatz habe ich die Eltern nach der while-Schleife pausieren lassen und eine Bedingung vom SIGCHLD-Handler gesendet, nur wenn waitpid den Fehler ECHILD (kein Kind übrig) zurückgegeben hat, aber das Problem, mit dem ich konfrontiert bin, ist noch bevor Eltern alle Forks beendet haben -1
void sigchld_handler(int signo) {
pid_t pid;
while((pid= waitpid(-1,NULL,WNOHANG)) > 0);
if(errno == ECHILD) {
retStat = -1;
}
}
**//parent process code**
retStat = 1;
while(some condition) {
do fork(and exec);
}
while(retStat > 0)
pause();
//This is the point where I want execution to resumed only when all children have finished
Ich muss WNOHANG Option geben, wenn es viele Kinder gibt, die SIGCHLD-Signal fast zur gleichen Zeit liefern, und da Signale nicht in UNIX eingereiht sind, wenn ich 0 verwende, dann werde ich nur ein Signal fangen können, dann Zombies werden herum gelassen werden. – avd
Nur um ein bisschen hinzuzufügen, wird die -1 gegen jede untergeordnete PID (könnte auch WAIT_ANY für Klarheit verwenden). – amischiefr
@aditya: Die Zombie-Prozesse warten nur darauf, dass Sie wait() (oder wait_pid()) auf ihnen aufrufen. Sobald Sie das tun, werden sie verschwinden, unabhängig davon, ob Sie das Signal empfangen haben oder nicht. Die wait() - Schleife nach der fork() - Schleife wird also alle Zombies aufwischen. –