原帖由 loc1129 于 2006-4-7 20:39 发表
>>"子进程的结束是串行的,如果SIGCHLD信号处理程序的执行时间不是太长的话,父进程应该来得及清理子进程。但如果子进程退出频率过高,可能会导致SIGCHLD信号丢失,这就会产生你提到的不规则的僵死进程 ...
在信号处理程序中会屏蔽当前信号
原帖由 westgarden 于 2006-4-7 21:34 发表
如果确实是这样的话,
可看看以下我的看法:
wait(&stat);是阻塞型等待。
也就是说,wait()要阻塞到所等待的子进程结束才返回。
在这段“等待的子进程结束”的时间内,信号处理程序屏蔽 ...
原帖由 loc1129 于 2006-4-7 21:57 发表
我测试的背景:一个父进程创建5个子进程,然后这5个子进程差不多在同一时刻递交5个SIGCHLD信号给父进程,测试结果如我前面所说
那么此时,对于wait来说应该是不阻塞的,它和waitpid一样获得了执行,但为什 ...
原帖由 loc1129 于 2006-4-7 21:57 发表
我测试的背景:一个父进程创建5个子进程,然后这5个子进程差不多在同一时刻递交5个SIGCHLD信号给父进程,测试结果如我前面所说
那么此时,对于wait来说应该是不阻塞的,它和waitpid一样获得了执行,但为什 ...
原帖由 rwen2012 于 2006-4-7 22:57 发表
测试过while(waitpid())形式非阻塞形式确实可以解决问题,
哪位高人可以再说说wait为什么不行,
原帖由 wz_uestc 于 2006-4-8 00:41 发表
我来说一下吧!首先记住这样一个事实:“信号可以阻塞但不会排队!”
当父进程正在处理第一个信号的时候,假设第二个信号SIGCHLD到来,它就会被阻塞并添加到待处理信号集里。(运用:信号可以阻塞)
如果 ...
原帖由 albcamus 于 2006-4-9 13:45 发表
传统Unix信号是不排队的, 较新的Posix实时信号是排队的。
原帖由 loc1129 于 2006-4-9 14:41 发表
unix网络编程 第一卷中介绍,SIGCHLD是UNIX传统信号,应该是要排队的
原帖由 loc1129 于 2006-4-9 14:41 发表
unix网络编程 第一卷中介绍,SIGCHLD是UNIX传统信号,应该是要排队的
原帖由 帅绝人寰 于 2006-4-10 10:35 发表
传统信号在deliver时, 先看是否已经有一个这样的sig在排队(注意这个排队指的是不同的信号的bitmap), 如果有, 干脆丢掉当前要deliver的信号。
你的程序说明不了问题的
原帖由 loc1129 于 2006-4-10 12:16 发表
首先更正我前面的一个贴子:SIGCHLD是不排队的(不好意思,是我打错了)
问题:为什么我的程序说明不了问题
我的信号处理函数处理一个信号的时间至少是5秒,那么我在5秒内提交至少三个SIGCHLD信号,又 ...
原帖由 cjaizss 于 2006-4-10 16:29 发表
当你正在信号处理的时候,传统UNIX只会知道在这段时间里进程接到了什么类型的型号,然而它却无法知道某一种类型的信号具体接收了多少个...
原帖由 wz_uestc 于 2006-4-10 14:44 发表
即使信号发生了丢失,但是while( (pid = waitpid(-1,&stat,WNOHANG)) > 0)只要执行,就可以将所有的僵尸进程回收!
原帖由 susesuse 于 2006-4-10 16:26 发表
也就是说waitpid函数不是由sigchild函数而驱动吧?它是用来检测进程是否已结束的是吗?
原帖由 rwen2012 于 2006-4-11 11:58 发表
可不可以这样理解?
原帖由 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 ...
#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;
}
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |