gpt4 book ai didi

process - 从父进程的信号处理程序终止子进程挂起

转载 作者:行者123 更新时间:2023-12-02 06:26:17 24 4
gpt4 key购买 nike

我在 posix 进程主题上遇到问题,无法解决。

我有一个进程,它 fork 几个子进程(进程树可能很复杂,不仅仅是一层)。它还会跟踪活跃 child 的 PID。在某个时刻,父进程收到一个信号(比如说 SIGINT)。

在 SIGINT 的信号处理程序中,它会迭代子进程列表并向它们发送相同的信号以防止僵尸进程。现在的问题是

  1. 如果父进程没有 waitpid() 来让子进程停止,则信号似乎永远不会被发送(僵尸继续运行)
  2. 如果父进程在每次向子进程发送kill()后都等待,它就会卡在那里,而子进程似乎会忽略该信号

父级和子级具有相同的信号处理程序,因为它是在 fork 之前安装的。这是一个伪代码。

signal_handler( signal )
foreach child in children
kill( child, signal )
waitpid( child, status )

// Releasing system resources, etc.
clean_up()

// Restore signal handlers.
set_signal_handlers_to_default()

// Send back the expected "I exited after XY signal" to the parent by
// executing the default signal handler again.
kill( getpid(), signal )

通过此实现,执行将在 waitpid 上停止。如果我删除 waitpid, children 就会继续运行。

我的猜测是,除非信号处理程序已经结束,否则从它发送的信号不会分派(dispatch)给子级。但如果我省略等待,为什么它们不会被调度?

提前非常感谢!

最佳答案

您所描述的内容应该有效,而且确实如此,通过以下测试用例:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

#define NCHILDREN 3
pid_t child [NCHILDREN];

struct sigaction sa, old;

static void
handler (int ignore)
{
int i;

/* Kill the children. */
for (i = 0; i < NCHILDREN; ++i)
{
if (child [i] > 0)
{
kill (child [i], SIGUSR1);
waitpid (child [i], 0, 0);
}
}

/* Restore the default handler. */
sigaction (SIGUSR1, &old, 0);

/* Kill self. */
kill (getpid (), SIGUSR1);
}

int
main ()
{
int i;

/* Install the signal handler. */
sa.sa_handler = handler;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (SIGUSR1, &sa, &old);

/* Spawn the children. */
for (i = 0; i < NCHILDREN; ++i)
{
if ((child [i] = fork ()) == 0)
{
/* Each of the children: clear the array, wait for a signal
and exit. */
while (i >= 0)
child [i--] = -1;
pause ();
return 0;
}
}

/* Wait to be interrupted by a signal. */
pause ();
return 0;
}

如果您看到父进程卡在 waitpid 中,则意味着子进程尚未退出。尝试附加调试器以查看子进程被阻止的位置,或者更简单的是,使用 strace(1) 运行程序。你如何清理你的 pid 数组?确保子进程不会尝试使用 pid 参数 <= 0 调用 waitpid。确保子进程不会阻塞或忽略信号。

关于process - 从父进程的信号处理程序终止子进程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938295/

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