免费注册 查看新帖 |

Chinaunix

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

关于SIGCHLD的不排队,丢弃的问题 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2008-10-10 12:21 |只看该作者
原帖由 flw 于 2006-9-15 17:20 发表

哎呀呀,简直费劲死了,其实说白了,就是一个“生产者-消费者”问题。
子进程结束的时候,系统“生产”出一个僵尸进程,
同时用 SIGCHLD 通知父进程来“消费”这个僵尸进程,
即使是 SIGCHLD 丢失了,没有来得及消费,
但是只要有一次消费,就会把所有的僵尸进程都处理光光!
(我再说一遍:因为,while(waitpid()) 是个循环嘛!)
...


flw讲的太好了! thx, ding!!!

论坛徽章:
0
62 [报告]
发表于 2008-10-10 12:58 |只看该作者
汗,挖好深的坟墓,不过好帖是要挖一挖的

论坛徽章:
0
63 [报告]
发表于 2008-10-10 13:06 |只看该作者
原来有讨论这个的精华贴.

自己找看看.

论坛徽章:
0
64 [报告]
发表于 2008-10-10 13:13 |只看该作者
对不起. 就是本贴呀

论坛徽章:
0
65 [报告]
发表于 2008-10-10 13:17 |只看该作者
呵呵,汗个

论坛徽章:
0
66 [报告]
发表于 2008-10-10 13:18 |只看该作者
其实在一般应用的程序中signal(SIGCHLD, SIG_IGN);就差不多够了

论坛徽章:
0
67 [报告]
发表于 2008-10-10 13:24 |只看该作者
是不是可以这样做,在SIGCLD信号处理函数执行是,阻塞这个信号,这个时候可能有多个SIGCLD信号到来,当信号处理函数执行完毕时会不会再依次的处理这些阻塞的信号?
是不是跟操作系统有关?

论坛徽章:
0
68 [报告]
发表于 2008-10-10 13:30 |只看该作者
相同信号被抛弃.

论坛徽章:
0
69 [报告]
发表于 2009-03-10 15:01 |只看该作者
对我这等菜鸟来说,这帖真是好帖啊    顺便贴一个转贴,希望有用


UNIX系统中wait函数簇和SIGCLD信号的关系(转)


有朋友疑惑“为什么有了wait函数族还需要使用SIGCHLD信号?”。本文详细地阐述UNIX系统中wait函数族和SIGCHLD信号的关系。

一、unix中僵尸进程的含义

关于unix中僵尸进程的含义,APUE2是这样定义:

In UNIX System terminology, a process that has terminated, but whose parent has not yet waited for it, is called a zombie.

也就是说,凡是父进程没有调用wait函数获得子进程终止状态的子进程在终止之后都是僵尸进程,这个概念的关键一点就是父进程是否调用了wait函数。

二、SIGCHLD信号

SIGCHLD信号的含义,APUE2又如是说:

Whenever a process terminates or stops, the SIGCHLD signal is sent to the parent. By default, this signal is ignored, so the parent must catch this signal if it wants to be notified whenever a child's status changes. The normal action in the signal-catching function is to call one of the wait functions to fetch the child's process ID and termination status.

简单的说,子进程退出时父进程会收到一个SIGCHLD信号,默认的处理是忽略这个信号,而常规的做法是在这个信号处理函数中调用wait函数获取子进程的退出状态。

三、既然在SIGCHLD信号的处理函数中要调用wait函数族,为什么有了wait函数族还需要使用SIGCHLD信号?G7Situg
G7Situg
我们知道,unix中信号是采用异步处理某事的机制,好比说你准备去做某事,去之前跟邻居张三说如果李四来找你的话就通知他一声,这让你可以抽身出来去做这件事,而李四真正来访时会有人通知你,这个就是异步信号一个较为形象的比喻。G7Situg
G7Situg
一般的,父进程在生成子进程之后会有两种情况:一是父进程继续去做别的事情,类似上面举的例子;另一是父进程啥都不做,一直在wait子进程退出。

SIGCHLD信号就是为这第一种情况准备的,它让父进程去做别的事情,而只要父进程注册了处理该信号的函数,在子进程退出时就会调用该函数,在函数中wait子进程得到终止状态之后再继续做父进程的事情。

最后,我们来明确以下二点:

1)凡父进程不调用wait函数族获得子进程终止状态的子进程在退出时都会变成僵尸进程。

2)SIGCHLD信号可以异步的通知父进程有子进程退出。

论坛徽章:
0
70 [报告]
发表于 2009-09-12 20:04 |只看该作者
原帖由 李某人 于 2009-3-10 15:01 发表


1)凡父进程不调用wait函数族获得子进程终止状态的子进程在退出时都会变成僵尸进程。

这句话说的过些了吧。
不用wait,而是signal(SIGCHLD, SIG_IGN)之后,子进程自己退出,也不会变成僵尸进程。
这时候再wait,会发现wait返回-1。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP