gpt4 book ai didi

c - 如何获取死掉的子进程的 PID 并在父进程中使用它?

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:24 27 4
gpt4 key购买 nike

我正在尝试制作一个 C 程序(适用于 FreeBSD、Unix),它在一个循环中创建 4 个子进程。每个 child 都做事,当他们死后,他们会立即被其他 child 取代。所以,最后,我有 4 个 child 一直在工作。

每个子 PID 都必须在表中注册,并且在它们死后,表的 PID 必须被删除。这是我遇到麻烦的部分。

所以在第一次尝试中,我尝试创建一个处理程序,它将死 child 的 PID 发送到一个全局变量:

int global_variable;

void handler_SIGCHLD(int sig)
{
pid_t son;
int e;

do {
son = wait3(&e, WNOHANG, NULL);
if ((son > (pid_t)0) && (WIFEXITED(e) || WIFSIGNALED(e)))
{
global_variable = son;
}
} while (son > (pid_t)0);
}

然后我在父级中使用它从表中删除死 child 的 PID。但后来我意识到,如果两个 child 同时死亡,其中一个的 PID 将被另一个覆盖。

如何避免这种情况?

最佳答案

您不应该从信号处理程序中执行此操作。您不应该通过信号处理程序执行任何操作(如果您希望保持理智)。

一种可靠的方法是将 SIGCHLD 信号转换为文件描述符事件,然后将其集成到事件循环中(selectpollepoll...)。当您观察一个事件时,您在一个循环中使用 waitpid(..., WNOHANG) 来收集所有死去的 child 。在这里查看我的答案的更多信息:https://stackoverflow.com/a/8398491/1020667

以上答案假定您使用的是 Linux 并使用 signalfd(Linux 特定工具)将信号转换为文件描述符。但您也可以使用“自管道”技巧(非常小心)或 kqueue(FreeBSD、OSX)。请注意,对于 kqueue,没有中间文件描述符,您可以像文件描述符事件一样直接接收信号事件。

另一方面,您可以通过使用可移植的事件循环库来绕过所有这些低级细节。一些库已经提供了启动和监视子进程的工具。我推荐 libuv(node.js 的)。

关于c - 如何获取死掉的子进程的 PID 并在父进程中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827230/

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