내 프로그램에서 유한 한 while 루프에서 자식 프로세스를 병렬 처리하고 각각에 exec를 수행하고있다. 부모 프로세스가 모든 자식이 종료 된 후에 만 실행을 다시 시작하기를 원합니다. 어떻게해야합니까?부모가 실행을 재개하기 전에 모든 자식 프로세스를 기다린다. UNIX
나는 여러 가지 접근법을 시도했다. 한 접근법에서, 나는 while 루프 후에 Parent를 멈추고 waitpid가 ECHILD (자식은 남아 있지 않음)를 반환했을 때만 SIGCHLD handler로부터 어떤 조건을 보냈지 만, 부모가 모든 프로세스를 fork하기 전에라도이 접근법에서 직면하고있는 문제는 retStat가된다. -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
WNOHANG 옵션을 주어야합니다. 왜냐하면 SIGCHLD 신호를 거의 동시에 전달하는 많은 자식이 있고 UNIX에서 신호가 대기열에 있지 않기 때문에 0을 사용하면 하나의 신호 만 잡을 수 있기 때문에 좀비가 돌아 다닐 지어다. – avd
비트를 추가하기 만하면 -1이 자식 pid를 확인합니다 (명확성을 위해 WAIT_ANY도 사용할 수 있음). – amischiefr
@aditya : 좀비 프로세스는 wait() (또는 wait_pid())를 호출하기 만하면됩니다. 그렇게하면 신호를 포착했는지 여부와 관계없이 사라질 것입니다. 따라서 fork() 루프 이후의 wait() 루프는 모든 좀비를 청소합니다. –