编程规范问题导致SIGCLD 屏蔽失效

     进程出现<defunct>状态进程,(zombie process )。对于创建多进程的场景, 子进程状态改变产生此信号, 对SIGCLD信号处理不当,会导致僵尸进程。 

     SIGCLD 是 System V(比较商业) 定义的一个信号  与SIGCHLD一样 。

     一般处理方式: 

     1.  忽略SIGCLD信号;

     2.  父进程调用wait等待所有子进程都终止。

     应用属于多进程模式,父进程主要功能就是根据配置信息创建多个业务子进程, 我们选用了第一种方式。

     在不同架构体系下, SIGCLD对应的数字是不一样的。

     在LINUX-X86平台 , SIGCLD=17 ,应用屏蔽了小于20的信号量, 当迁移到AIX-SPARC  SIGCLD(SIGHCLD)=20,原有应用屏蔽未生效。

     目前采取了简单粗暴的方案, 调整上限为 SIGRTMAX.

      编程不够规范导致,这一问题在: 皓哥推荐  的 C codeing stardard 中的 No Magic Numbersv    , 中也提到了。 

       类似的一些代码规范, 如:代码大全 中12.7  提到了Named Constants 。

      在实际编程中要避免使用文字量, 根据现有系统改造时, 要根据情况选用 const, enum, #define,在调用外部API也要使用具名变量方式,这样会使自己的代码更加规范整洁。 

      参考文档:

      signal(7)

Be First to Comment

发表回复