我正在fork(),exec()和相关的UNIX调用上进行赋值,我需要显示(子)进程的僵尸状态。这是相关的代码:
pid = vfork(); //used vfork() for showing z state
if(pid>0)
{
(some sorting code)
execl("/bin/ps","/bin/ps","a",(char*)0);
}
我的期望是:
(child's output)
(parent's output)
(Output of the ps command where I then would be able to show a 'defunct' entry)
我得到的是:
(child's output)
(parent's output)
No ps command output. Instead I get: Signal 17 (CHLD) caught by ps (procps version 3.2.8)
但是,在sleep(int time)
调用之前插入execl
(以秒为单位的某个整数时间)时,我会得到所需的输出,并且不会报告信号错误。
这里发生了什么? ps
成为(还是僵尸)孩子的新父母吗?
为什么ps
命令不执行? sleep()
做什么使ps
按要求执行?
我是POSIX / Linux编程的新手,所以我会赞赏这个SIGCHLD
信号与我的特定情况有关。谢谢!
答案 0 :(得分:0)
我可能错了,但我认为发生的事情就是这样:
if
的一半,执行ps
。 ps
后,SIGCHLD
会因为孩子终止而被发送到父进程(信号可能很慢且无法预测)SIGCHLD
会传递给忽略它的父级,然后控制传递给ps
。答案 1 :(得分:-1)
<强>标题强>
ps -ef因Redhat 6.6上的“信号17(CHLD)被ps捕获(procps版本3.2.8)”而失败
<强>描述强>
在Redhat 6.6上运行ps -ef命令时失败并出现以下错误: “信号17(CHLD)被ps捕获(procps版本3.2.8)”
原因
这是第三方问题。 Redhat创建了以下文章来跟踪问题:
https://access.redhat.com/solutions/1235753
解决强>
有关最新的解决方法,请参阅Redhat文章。 https://access.redhat.com/solutions/1235753 其中包括重命名libfreebl3.chk文件,如下所示:
# mv /lib/libfreebl3.chk /lib/libfreebl3.chk-bz1153759
# mv /lib64/libfreebl3.chk /lib64/libfreebl3.chk-bz1153759
其他信息
这似乎已由RedHat修复。见RHBA-2014:1867