免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: Kevinkw
打印 上一主题 下一主题

UNIX或Linux系统对信号是否有排队机制 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-04-11 12:22 |只看该作者
原帖由 rwen2012 于 2006-4-11 11:58 发表


可不可以这样理解?



应该可以这样说吧!
重点是使用了while循环!
如果不用while循环,也达不到上述效果!

论坛徽章:
0
32 [报告]
发表于 2008-05-20 15:27 |只看该作者
楼主混淆了两个问题:
一是信号是否排队
二是多个子进程结束时是否会丢失对某个子进程的退出处理

第一个问题是大多数UNIX系统不对信号排队
第二个问题是可以在某个子进程的处理函数里while(watipid())来处理其它子进程的退出,所以就不用担心某个子进程退出主进程不知道的的问题。

楼主的本意也许是“主进程能否处理所有子进程的退出”

论坛徽章:
0
33 [报告]
发表于 2009-03-31 11:07 |只看该作者
原帖由 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;
}

论坛徽章:
0
34 [报告]
发表于 2009-12-17 16:28 |只看该作者
不好意思,把僵尸贴拉了出来,我想问下:

1    void sig_chld(int signo)
2    {
3          pid_t pid;
4          int stat;
5          while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0 )
6               printf("child %d terminated\n", pid);
7           return;
8     }

如果在第5个语句(waitpid返回0)与第7个语句(或者说退出sig_chld函数前)之间又有SIGCHLD信号发过来,那不是又有可能产生僵尸进程?
我的理解是不同类型的信号是排队的,相同类型的信号是不排队的,也就是信号处理程序屏蔽了当前信号SIGCHLD,
父进程也就无法处理其他子进程发的SIGCHLD信号。

[ 本帖最后由 scut_tang 于 2009-12-17 16:38 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
35 [报告]
发表于 2009-12-17 16:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
36 [报告]
发表于 2009-12-17 19:04 |只看该作者
原帖由 c/unix 于 2009-12-17 16:42 发表


对,是会产生僵死进程。不是用while回收了吗

我的意思是当waitpid返回0,然后SIGCHLD信号发送过来,但是父进程还处于sig_chld信号处理函数里面,那不是把SIGCHLD信号丢掉了?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
37 [报告]
发表于 2009-12-17 21:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
38 [报告]
发表于 2012-02-21 20:03 |只看该作者
a 回复下是为了保存帖子回家学习

论坛徽章:
0
39 [报告]
发表于 2012-02-24 22:36 |只看该作者
c/unix 发表于 2009-12-17 21:12
就是把他丢了,如果不丢就不用用while了


:wink:

论坛徽章:
1
巳蛇
日期:2014-04-17 12:33:24
40 [报告]
发表于 2013-07-14 16:48 |只看该作者
可以理解为,(wait,waitpid)与SIGCHLD无关,调用wait和waitpid不依赖SIGCHLD,即使丢失了SIGCHLD,两个函数也可以得到终止子进程的信息
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP