- 论坛徽章:
- 0
|
我的看法,不一定对啊,呵呵.先看看下面的程序.
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- void sig_child(int signo)
- { pid_t pid;
- int stat;
- while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)
- {
- printf("child %d exit\n",pid);
- sleep(5);//这应该导致信号丢失吧?
- }
- return;
- }
- void child_func()
- {
- return;
- }
- int main()
- {
- pid_t pid;
- int i = 0;
- signal(SIGCHLD,sig_child);
- for(;i < 5;i ++)
- {
- if( (pid = fork()) == 0)
- {
- child_func();
- printf("child function finished\n");
- exit(0);
- }
- else if(pid > 0)
- {
- continue;
- }
- else
- {
- printf("fork failed\n");
- exit(1);
- }
- }
- return 0;
- }
复制代码
linux:~/test # gcc -o waitpid waitpid.c
linux:~/test # ./waitpid
child function finished
child 7449 exit
child function finished
child 7450 exit
child function finished
child 7454 exit
child function finished
child 7455 exit
child function finished
child 7459 exit
对于SIGCHILD信号(属于不可靠信号,不支持信号排队.),按理说应该有信号丢失,可为什么还是输出5次呢?这实际上没有把握清楚waitpid(-1,&stat,WNOHANG)函数的作用.它是用来用来检测进程是否已结束并回收僵尸进程的,在这个程序里信号确实会丢失的.但waitpid函数不是由SIGCHILD信号驱动的. |
|