进程出现<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也要使用具名变量方式,这样会使自己的代码更加规范整洁。
参考文档:
Be First to Comment