mini-shell中恢复已停止进程时无法唤醒其子进程的问题求助
解决方法
问题原因是你仅给父进程单独发送了SIGCONT信号,它派生的sleep子进程没有收到恢复信号,按照POSIX标准的shell作业管理逻辑,按以下步骤修改即可:
- 启动作业时先做进程组绑定:fork出作业的第一个进程后,在子进程侧调用
setpgid(0, 0),父进程侧同步调用setpgid(child_pid, child_pid),让该作业后续派生的所有子进程都归属到同一个进程组下。你的迷你shell需要为每个作业记录对应的进程组ID(PGID),不要只存首进程的PID。 - 发信号时指定进程组:不管是发SIGTSTP停止作业还是发SIGCONT恢复作业,都将kill的第一个参数设为负的进程组ID,比如示例中作业的PGID是2903651,就调用
kill(-2903651, SIGCONT),内核会自动把信号发给该进程组内的所有进程,父进程和所有子进程都会同步恢复运行,sleep进程恢复后就会正常打印Hi。 - 临时兼容方案:如果暂时不想改造进程组逻辑,也可以遍历
/proc/[pid]/task/[tid]/children节点递归找到目标PID的所有子进程,逐个发送SIGCONT信号,不过该方案依赖proc文件系统,可移植性差,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者marque
相关产品推荐
相关产品推荐

