Здесь
while(waitpid(pid,&status,WNOHANG)==-1) { }
если не существует дочернего процесса, то waitpid
возвращает -1
, и он всегда делает while(true)
, что вызывает бесконечный цикл.
со страницы руководства waitpid()
.
waitpid():
в случае успеха возвращает идентификатор процесса ребенка, чей
состояние изменилось ; если был указан WNOHANG
и один или несколько
child (ren), заданный pid
, существует, но еще не изменил состояние,
тогда 0
возвращается. При ошибке возвращается -1
.
Это означает, что когда больше нет дочерних элементов, ожидающих, возвращается -1
. Так что либо сделай это как
if() { /* child process. can be multiple */
}
else { /* parent process */
while(waitpid(pid,&status,WNOHANG) != -1) { /* when there is no more child process exists then it terminate */
}
}
или
if() { /* child process. can be multiple */
}
else { /* parent process */
while(waitpid(pid,&status,WNOHANG) == -1); /* dummy while ..when there is no more child process exists then it terminate */
}