【问题标题】:execl()-ing in parent process: SIGCHLD caught by ps父进程中的 execl()-ing: SIGCHLD 被 ps 捕获
【发布时间】:2012-07-21 15:30:09
【问题描述】:

我正在对 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)

但是,当在 execl 调用之前插入 sleep(int time)(以秒为单位的整数时间)时,我得到了所需的输出并且没有报告任何信号错误。

这里发生了什么? ps 是否成为(尚未成为僵尸的)孩子的新父母? 为什么ps 命令不执行? sleep() 做了什么使 ps 按要求执行?

我是 POSIX/Linux 编程的新手,因此我将不胜感激此 SIGCHLD 信号与我的特定情况的任何相关性。谢谢!

【问题讨论】:

  • 什么是“(一些排序代码)”?如果它有任何可能触发系统调用,它可能是不安全的或至少是未定义的。通常你只能做琐碎的事情(例如,一堆不分配内存或调用操作系统的计算),然后再调用一个孩子的execXX()函数。
  • (一些排序代码)只是整数数组的选择排序代码。没有使用任何其他系统调用,没有指针,malloc() 也没有。
  • @KevinGrant:vfork(),是的。用普通的fork(),没有。
  • 它可能取决于 UNIX 变体,但我肯定见过普通的 fork() 版本,其中包含儿童可以做什么的警告。
  • 请注意,一般情况下,在 vfork() 孩子中唯一安全的做法是调用 exec*()_exit() 和/或修改 pid_t 类型的变量以存储结果的vfork()。如果您想等待孩子,请使用fork()wait*() 系列函数之一。

标签: linux unix exec fork sigchld


【解决方案1】:

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

  • 您的孩子开始并在父母阻止时执行排序代码。
  • 孩子退出了。
  • 父进程是if 的一半,执行ps
  • ps 启动后,SIGCHLD 因为子进程终止而被发送到父进程(信号可能很慢且不可预测)
  • 如果添加睡眠,SIGCHLD 将传递给忽略它的父级,然后控制权传递给ps

【讨论】:

  • “孩子还活着”是什么意思?不是已经是丧尸了吗?我正在使用vfork(),这会导致父进程等到孩子的状态发生变化(我们可以在这里假设“终止”为“状态变化”)所以,在执行execl时,子进程必须已经以完成的方式终止。
  • @black_stallion:嗯。我刚刚阅读了手册页,你的权利。
  • system("ps") 将是一个快速修复,但我希望了解为什么 execl 显然不能被使用。
  • @black_stallion:你在孩子身上做什么? ifelse 分支中有什么代码?
  • 两个 printf 语句后跟一个排序函数调用(同样,此函数中没有使用 sys 调用)和一个 exit(EXIT_SUCCESS) 在结尾 } 之前
【解决方案2】:

标题

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

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多