免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xltao

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

论坛徽章:
0
发表于 2006-09-15 20:53 |显示全部楼层
原帖由 flw 于 2006-9-15 17:20 发表

根本就不需要找回来!
好比有五个进程,
不妨分别称为 p1 p2 p3 p4 p5,
一开始 p1 结束了,发了一个 SIGCHLD(s1),
这时父进程可能空闲了,于是开始处理这个信号,假设处理的过程中 p2 又结束了,又发了一 ...



关键是一句话信号和waitpid没有关系!一个触发条件,一个是动作,程序写为while(...),就是考虑可能的收到一个信号,释放多个僵尸进程。

论坛徽章:
0
发表于 2006-09-17 01:04 |显示全部楼层
原帖由 rock_jq 于 2006-9-15 18:19 发表
受益,
while ( (exit_pid=wait(&status)) != -1 ) ctrl_c_op();
这样可否获取所有子进程?

可以的
你试试就知道了

论坛徽章:
0
发表于 2006-09-18 10:55 |显示全部楼层
不敢苟同的意见,僵死进程在某些应用中必须很好的解决。

我们就是在进程池中没处理好子进程的退出状态,而使整个系统不能工作。

一个进程回收不到就会占用一个我们的一个进程表,也就是占用一个进程池的位置,当僵死进程达到一定限度后,程序就会不再FORK新进程,而这些僵死进程已经退出,无法处理请求,所以整个系统不在工作。

以前我们的程序就是按版主所说的方式进行循环接收,但根本无法避免大批量并发快速请求。

事实证明我所采用的让SIGCHLD进行排队回收机制可以很好的处理了这个问题。

我觉得这个问题要看应用在什么系统中,以前的程序我也是循环接收,不是太多的并发请求也是没有问题的,所以也没怀疑过这个办法。

代码我就不贴了,我只说说原理吧:

主进程创建一个队列,我用的是一个线程循环接收队列的信息,没有的时候阻塞。waitpid的时候也是采用阻塞的方式,防止子进程退出的时间大于父进程接到信号的时间(队列结构包含一个进程号)
waitpid(队列中的PID号, &status, 0);

子进程退出之前要往队列发送自已的PID,然后才退出。

[ 本帖最后由 linternt 于 2006-9-18 10:59 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-09-18 11:00 |显示全部楼层
原帖由 linternt 于 2006-9-18 10:55 发表
不敢苟同的意见,僵死进程在某些应用中必须很好的解决。

我们就是在进程池中没处理好子进程的退出状态,而使整个系统不能工作。

一个进程回收不到就会占用一个我们的一个进程表,也就是占用一个进程池的位 ...

特殊情况特殊处理,本来就没有什么一劳永逸的做法。
BTW:如果回收没有什么特别的动作的话,像你所说的那种情况,为什么不 signal( SIGCHLD, SIG_IGN ) 呢?

论坛徽章:
0
发表于 2006-09-18 11:30 |显示全部楼层
原帖由 flw 于 2006-9-18 11:00 发表

特殊情况特殊处理,本来就没有什么一劳永逸的做法。
BTW:如果回收没有什么特别的动作的话,像你所说的那种情况,为什么不 signal( SIGCHLD, SIG_IGN ) 呢?


因为我们要维护一个自已的进程池。

论坛徽章:
0
发表于 2006-09-18 11:53 |显示全部楼层
从原理上没有回收不到的问题。
那问题出在哪里? 内核本身? 还是进程?

论坛徽章:
0
发表于 2006-09-18 12:37 |显示全部楼层
原帖由 linternt 于 2006-9-18 10:55 发表
不敢苟同的意见,僵死进程在某些应用中必须很好的解决。

我们就是在进程池中没处理好子进程的退出状态,而使整个系统不能工作。

一个进程回收不到就会占用一个我们的一个进程表,也就是占用一个进程池的位 ...

为什么会回收不到?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-09-18 12:52 |显示全部楼层
to 楼上两位:
我觉得他所说的“回收不到”应该指的是“回收不够及时”。应该是对性能的影响而不是对功能的影响。
参考:
以前我们的程序就是按版主所说的方式进行循环接收,但根本无法避免大批量并发快速请求。

论坛徽章:
0
发表于 2006-09-18 13:13 |显示全部楼层
原帖由 flw 于 2006-9-18 11:00 发表

特殊情况特殊处理,本来就没有什么一劳永逸的做法。
BTW:如果回收没有什么特别的动作的话,像你所说的那种情况,为什么不 signal( SIGCHLD, SIG_IGN ) 呢?

POSIX规定不能忽略SIGCHLD

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-09-18 13:15 |显示全部楼层
原帖由 isnowran 于 2006-9-18 13:13 发表

POSIX规定不能忽略SIGCHLD

出处?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP