我讀過一個waitpid(-1,& status,WNOHANG)的電子書,應該放在while循環之下,這樣如果多個子進程同時退出,它們都會被獲得。爲什麼waitpid在信號處理程序中需要循環?
我試着通過在同一時間創建和終止兩個子進程並通過waitpid使用循環來收割它。這些都被收穫了。
問題是,在循環中放置waitpid是非常必要的嗎?
#include<stdio.h>
#include<sys/wait.h>
#include<signal.h>
int func(int pid)
{
if(pid < 0)
return 0;
func(pid - 1);
}
void sighand(int sig)
{
int i=45;
int stat, pid;
printf("Signal caught\n");
//while((
pid = waitpid(-1, &stat, WNOHANG);
//) > 0){
printf("Reaped process %d----%d\n", pid, stat);
func(pid);
}
int main()
{
int i;
signal(SIGCHLD, sighand);
pid_t child_id;
if((child_id=fork()) == 0) //child process
{
printf("Child ID %d\n",getpid());
printf("child exiting ...\n");
}
else
{
if((child_id=fork()) == 0) //child process
{
printf("Child ID %d\n",getpid());
printf("child exiting ...\n");
}
else
{
printf("------------Parent with ID %d \n",getpid());
printf("parent exiting ....\n");
sleep(10);
sleep(10);
}
}
}
兩個子進程正在收割。爲什麼? – rishi