- 论坛徽章:
- 0
|
原帖由 susesuse 于 2006-4-10 12:06 发表 ![]()
#include
#include
#include
#include
#include
void sig_child(int signo)
{
pid_t pid;
int stat;
while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)
{
printf("child %d exit\n",pid);
sle ...
你这个程序有问题,你的程序的执行过程是:
father fork child 1
child 1 exit
father handle sigchild 1
这个时候:
father fork child 2
child 2 exit
father handle sigchild 1
以此类推
...
因为father刚fork完child1就接到sigchild1,所以先去执行sigchild1而导致无法继续fork child2。所以整个过程实际上变成只有2个进程再跑了,你要等child全部fork完,然后再全部同时死去,这样就会出现信号丢失了,真正只处理了第一信号,看我改后的程序:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int total=0;
void sig_child(int signo)
{
pid_t pid;
int stat;
//while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)
if(1)
{
printf("child %d exit\n",total++);
sleep(1);
}
return;
}
void child_func()
{
sleep(5); //let child wait...
return;
}
int main()
{
pid_t pid;
int i = 0;
signal(SIGCHLD,sig_child);
for(;i < 100;i ++)
{
if( (pid = fork()) == 0)
{
pid_t child=getpid();
printf("child[%d] function start..\n",child);
child_func();
printf("child[%d] function finished!\n",child);
fflush(stdout);
exit(0);
}
else if(pid > 0)
{
continue;
}
else
{
printf("fork failed\n");
exit(1);
}
}
printf("Father waiting for sigchild...\n");
pause();
return 0;
} |
|