execl() - 在父进程中:由ps捕获的SIGCHLD

时间:2012-07-21 15:30:10

标签: linux unix exec fork sigchld

我正在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信号与我的特定情况有关。谢谢!

2 个答案:

答案 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