【发布时间】:2017-08-22 05:31:06
【问题描述】:
我在一本电子书中读到,waitpid(-1, &status, WNOHANG) 应该放在一个while循环下,这样如果多个子进程同时退出,它们都会被收割。
我通过同时创建和终止 2 个子进程并在不使用循环的情况下通过 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);
}
}
}
【问题讨论】:
-
两个子进程都在被收割。为什么?