免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1655 | 回复: 4
打印 上一主题 下一主题

[C] 求助一个守护进程信号处理的问题, 谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-18 11:59 |只看该作者 |倒序浏览
刚才看了一下守护进程的创建的一些基本步骤,都有涉及到对 SIGCHLD 信号的处理:

处理SIGCHLD信号:

处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时fork子进程出来处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)而仍占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在系统V下可以简单地将SIGCHLD信号的操作设为SIG_IGN,即忽略掉。这样,内核在子进程结束时不会产生僵尸进程,这一点与BSD4不同,在BSD4下必须显示等待子进程结束才能释放僵尸进程。


1.通常情况下,需要接受SIGCHLD,处理函数里调用wait或waitpid对子进程进行回收,否则的话会出现僵尸进程, 上面描述的情况是SIGCHLD信号的操作设为SIG_IGN,即忽略掉,父进程并没有进行回收工作,但是这就可以避免子进程成为僵尸,而让init去对他进行回收吗??
2.此外,如果产生了僵尸进程的话,除非系统重新启动,否则僵尸进程就一直会占用系统资源??

谢谢大家!

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-10-18 12:36 |只看该作者
1.通常情况下,需要接受SIGCHLD,处理函数里调用wait或waitpid对子进程进行回收,否则的话会出现僵尸进程, 上面描述的情况是SIGCHLD信号的操作设为SIG_IGN,即忽略掉,父进程并没有进行回收工作,但是这就可以避免子进程成为僵尸,而让init去对他进行回收吗??

<<no, the zombie structure not be created (init process call wait/ waitpid for the orphans, an orphan process is a process that is parent process is allready dead before it die)

2.此外,如果产生了僵尸进程的话,除非系统重新启动,否则僵尸进程就一直会占用系统资源??
<< yes. but i don't know if there are any additional api to clear this structure.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-18 13:38 |只看该作者
1, 实际开发中, SIGCHLD都是阻塞掉的, 在I/O loop中采用非阻塞的waitpid尝试回收, 不会影响服务端并发程度.

    楼主说的忽略SIGCHLD就可以避免僵尸进程, 是一个很特别的特性, 不可移植, 所以不要使用, manpage中是有详细说明的:
       POSIX.1-1990  disallowed  setting the action for SIGCHLD to SIG_IGN.  POSIX.1-2001 allows this possibility, so that ignoring SIGCHLD can be used
       to prevent the creation of zombies (see wait(2)).  Nevertheless, the historical BSD and System V behaviors for ignoring SIGCHLD differ, so  that
       the  only  completely  portable  method  of ensuring that terminated children do not become zombies is to catch the SIGCHLD signal and perform a
       wait(2) or similar.


2, 是的, 一直占用, 这个伴随内核的.

论坛徽章:
0
4 [报告]
发表于 2012-10-18 14:12 |只看该作者
后台进程还是需要处理SIGCHLD的吧,要不子进程木办法回收哇{:3_189:}

论坛徽章:
0
5 [报告]
发表于 2012-10-18 14:58 |只看该作者
谢谢大家的回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP