循环回收
循环创建10个子进程,并返回创建编号,回收子进程。
注意,在捕捉回收函数中应该使用while循环回收;
如果使用if,有可能在函数执行期间内,多个子进程死亡,但只会回收一个子进程。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<signal.h>
#include<sys/wait.h>
#include<errno.h>
void sys_err(char* str)
{
perror(str);
exit(1);
}
void do_sig_child(int signo)
{
int status;
pid_t pid;
//if((pid=waitpid(0,&status,WNOHANG))>0){
while((pid=waitpid(0,&status,WNOHANG))>0)//使用while确保全部回收
{
if(WIFEXITED(status))
printf("------------child %d exit %d\n",pid,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf("child %d cancel signal %d\n",pid,WTERMSIG(status));
}
}
int main(void)
{
pid_t pid;
int i;
for(i=0;i<10;i++)
{
if((pid=fork())==0)
break;
else if(pid<0)
sys_err("fork");
}
if(pid==0)
{
int n=1;
while(n--)
{
printf("child ID %d\n",getpid());
sleep(1);
}
return i+1;
}
else if(pid>0)
{
struct sigaction act;
act.sa_handler = do_sig_child;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGCHLD,&act,NULL);
while(1)
{
printf("I am parent %d\n",getpid());
sleep(1);
}
}
}