我试图弄清楚发送 SIGCHLD 信号的进程的 pid 是什么,我想在为 SIGCHLD 创建的信号处理程序中执行此操作。我该怎么做?我正在努力:
int pid = waitpid(-1, NULL, WNOHANG);
因为我想等待任何产生的子进程。
如果您使用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指定的子进程的status不可用,并且pid指定的任何进程的status都不可用,返回0。否则,应返回 -1,并设置 errno 以指示错误。