1

我正在对 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我将不胜感激此信号与我的特定情况的任何相关性。谢谢!

4

2 回答 2

0

我可能错了,但我认为正在发生的事情是这样的:

  • 当父母阻止时,您的孩子开始并执行排序代码。
  • 孩子退出。
  • 父母做它的一半,正在if执行ps
  • ps启动后,SIGCHLD由于子进程终止而发送到父进程(信号可能很慢且不可预测)
  • 如果添加睡眠,则将其SIGCHLD传递给忽略它的父级,然后将控制权传递给ps.
于 2012-07-21T16:12:13.300 回答
-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)”

原因

这是第 3 方的问题。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

于 2015-06-17T09:35:53.887 回答