我正在尝试制作一个 C 程序(用于 FreeBSD、Unix),它在循环中创建 4 个子进程。每个孩子都会做一些事情,当他们死后,他们会立即被其他孩子取代。所以,最后,我有 4 个孩子一直在工作。
每个子 PID 都必须在一个表中注册,并且在它们死后,必须删除该表的 PID。这是我遇到麻烦的部分。
所以在第一次尝试中,我尝试创建一个处理程序,它将死孩子的 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);
}
然后我在父级中使用它从表中删除死去的孩子的 PID。但后来我意识到,如果两个孩子同时死亡,其中一个 PID 将被另一个覆盖。
我怎样才能避免这种情况?