gpt4 book ai didi

c - 跟踪子进程的死亡

转载 作者:IT王子 更新时间:2023-10-29 00:18:12 26 4
gpt4 key购买 nike

如何在不让父进程等待子进程被杀死的情况下追踪子进程的死亡?

我正在尝试一个客户端-服务器方案,其中服务器接受来自客户端的连接并为它接受的每个连接创建一个新进程。

我忽略了 SIGCHLD 信号以防止僵尸创建。

signal(SIGCHLD, SIG_IGN);
while(1)
{
accept();
clients++;
if(fork() ==0)
{
childfunction();
clients--;
}
else
{
}
}

上述场景中的问题是,如果子进程在 childfunction() 函数中被终止,则全局变量 clients 不会递减。

注意:我正在寻找不使用 SIGCHLD 信号的解决方案......如果可能的话

最佳答案

通常,您为 SIGCHLD 编写处理程序,它在 pid -1 上调用 waitpid()。您可以使用它的返回值来确定什么 pid 死了。例如:

void my_sigchld_handler(int sig)
{
pid_t p;
int status;

while ((p=waitpid(-1, &status, WNOHANG)) != -1)
{
/* Handle the death of pid p */
}
}

/* It's better to use sigaction() over signal(). You won't run into the
* issue where BSD signal() acts one way and Linux or SysV acts another. */

struct sigaction sa;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = my_sigchld_handler;

sigaction(SIGCHLD, &sa, NULL);

或者,您可以使用指定的子进程 ID 调用 waitpid(pid, &status, 0),并同步等待它结束。或使用WNOHANG 无阻塞地检查其状态。

关于c - 跟踪子进程的死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377811/

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