# 编程规范问题导致SIGCLD 屏蔽失效
Date: 2019-04-30


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

     S**IGCLD 是 System V（比较商业） 定义的一个信号**  与**SIGCHLD一样 。**

     一般处理方式： 

     1.  忽略SIGCLD信号;

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

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

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

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

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

      编程不够规范导致，这一问题在： 皓哥推荐  的 [C codeing stardard](https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html) 中的 [No Magic Numbersv](https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html#nomagic)    ， 中也提到了。 

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

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

      参考文档：

      [signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html)

