gpt4 book ai didi

linux - 在父进程 : SIGCHLD caught by ps 中执行

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:08 26 4
gpt4 key购买 nike

我正在对 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 是否成为(尚未成为僵尸的) child 的新 parent ?为什么 ps 命令不执行? sleep() 做了什么使 ps 按要求执行?

我是 POSIX/Linux 编程的新手,所以如果这个 SIGCHLD 信号与我的特定情况相关,我们将不胜感激。谢谢!

最佳答案

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

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

关于linux - 在父进程 : SIGCHLD caught by ps 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11593459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com