恢复停止的进程不会恢复其子进程

Resuming stopped process doesn't resume its children

我写了一个模拟迷你-shell 程序,它可以像 shell 一样接受用户命令。我正在尝试复制 stopping/resuming 从我的 mini-shell.

中启动的进程的功能

我能够拦截并处理 SIGTSTP 信号以停止一个长 运行 进程(w/o 停止我的 mini-shell),它只是在每个 X 回显“Hi”秒。

我还能够使用 kill(pid, SIGCONT); 恢复长 运行 进程(在这种情况下 kill(2903651, SIGCONT) 将被执行)。问题是,sleep 子进程仍然处于停止状态,并且“嗨”消息不会恢复打印。其他没有子进程的进程也能正常工作。

我的问题是,有什么方法可以让给定 pid 的进程完全恢复,包括它的子进程?

假设父级没有更改子级(和孙级)的进程组,您应该能够使用 killpg() 向整个进程组发出信号。默认情况下,进程组将具有与父 PID 相同的值,并将包括 PID 的所有子进程。

在您上面的示例中,这将是:

killpg(2903651, SIGCONT);

出于测试目的,在 shell 内,您可以通过将父 PID 指定为进程组来完成相同的操作,如负数,例如

kill -CONT -2903651