【问题标题】:Determine pid of terminated process确定终止进程的pid
【发布时间】:2011-02-05 10:24:33
【问题描述】:

我试图找出发送 SIGCHLD 信号的进程的 pid 是什么,我想在我为 SIGCHLD 创建的信号处理程序中执行此操作。我该怎么做?我正在尝试:

int pid = waitpid(-1, NULL, WNOHANG);

因为我想等待任何产生的子进程。

【问题讨论】:

  • 您的方法是正确的,应该可以。你有什么问题?
  • 如何获取发送 SIGCHLD 的进程的 pid?
  • waitpid() 返回终止子进程的 pid,如果您从信号处理程序调用它。

标签: c signals waitpid


【解决方案1】:

如果您或多或少地使用waitpid(),如图所示,您将被告知其中一个已死亡的子进程的 PID — 通常,这将是唯一已死亡的进程,但如果您得到一连串他们,你可能会得到一个信号和许多尸体要收集。所以,使用:

void sigchld_handler(int signum)
{
    pid_t pid;
    int   status;
    while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
    {
        unregister_child(pid, status);   // Or whatever you need to do with the PID
    }
}

如果不关心孩子的退出状态,可以将&status替换为NULL

不同系统记录waitpid() 的返回值略有不同。但是,POSIX 是比较谨慎的一种,它说:

如果wait()waitpid() 因为子进程的状态可用而返回,这些函数应返回一个等于报告状态的子进程的进程ID 的值。如果wait()waitpid() 由于向调用进程传递信号而返回,则应返回-1 并将errno 设置为[EINTR]。如果waitpid()是在options中设置了WNOHANG的情况下调用的,它至少有一个pid指定的状态不可用的子进程,并且pid指定的任何进程的状态都不可用,返回0。否则返回-1,设置errno表示错误。

【讨论】:

  • wait(3p): If waitpid() was invoked with WNOHANG set in options, it has at least one child process specified by pid for which status is not available, and status is not available for any process specified by pid, 0 is returned. 似乎正确的条件是> 0,然后也许检查errno
  • 我同意,@LHLaurini,我已经更新了我的答案以符合你的建议。谢谢!
猜你喜欢
  • 2011-06-05
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多