恢复停止的进程不会恢复其子进程
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
我写了一个模拟迷你-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