【发布时间】: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 进程产生的孩子(和孙子)的 PID? -
不发送 SIGCONT 给父进程,而是发送给进程组。
标签: c linux unix process operating-system