【问题标题】:Resuming stopped process doesn't resume its children恢复停止的进程不会恢复其子进程
【发布时间】:2021-11-06 15:16:27
【问题描述】:

我编写了一个模拟迷你 shell 程序,它可以像 shell 一样接受用户命令。我正在尝试复制停止/恢复从我的 mini-shell 中启动的进程的功能。

我能够截获并处理 SIGTSTP 信号以停止一个长时间运行的进程(无需停止我的 mini-shell),该进程只是每隔 X 秒回显“Hi”。

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

我的问题是,有没有办法让给定 pid 的进程完全恢复,包括它的子进程?

【问题讨论】:

  • 父级需要处理 SIGCONT,然后显式地向每个子级发送一个 SIGCONT 以恢复它们。
  • 这里需要注意的是,我们无法控制从 mini-shell 启动的父进程 (repeatHi)(否则它会破坏目的)。我可以很容易地获得 repeatHi 的 PID,因为那是来自 mini-shell 的fork-exec-ed,但我还需要以某种方式递归地获取从 mini-shell 中的 repeatHi 进程产生的孩子(和孙子)的 PI​​D?
  • 不发送 SIGCONT 给父进程,而是发送给进程组。

标签: c linux unix process operating-system


【解决方案1】:

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

在你上面的例子中,那将是:

killpg(2903651, SIGCONT);

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

kill -CONT -2903651

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多