bg 中 shell 的 fork 子进程是否收到来自父进程的 SIGSTOP 信号?

bg 中 shell 的 fork 子进程是否收到来自父进程的 SIGSTOP 信号?

相关于信号手册页

通过 fork(2) 创建的子进程继承其父进程的信号配置的副本。在 execve(2) 期间,已处理信号的处理将重置为默认值;被忽略信号的处理保持不变。

在这种情况下,子进程在前台还是后台运行应该完全无关。

例子:

如果我xterm作为子 bg 进程开始shell...

xterm &

xterm...然后启动一个 bg 进程

`ls -lR / &`

当我在 shell 中ls停止时,进程是否停止xterm

kill -STOP [pid_of_xterm]

我想不会,但我不知道为什么。

我感谢您的帮助...

答案1

通过 fork(2) 创建的子进程继承其父进程的信号配置的副本。

这意味着孩子把手信号处理方式与其父级相同:它具有相同的信号处理程序和相同的忽略信号集。这并不意味着向父进程发送信号也会以某种方式向子进程发送信号(否则,杀死一个进程也会杀死它的所有后代......)。

一个过程可能使用信号处理程序进行编程,将信号中继到其部分或全部子级,但这并不常见。而对于SIGKILL、SIGSTOP等无法处理的信号根本无法做到。执行此操作的罕见情况是交互式 shell 将 SIGHUP 传播到正在运行的作业。

在您的示例中,如果 ls 进程是 shell 的子进程,而 shell 是 xterm 的子进程,则向 xterm 进程发送 STOP 信号只会停止 xterm 进程。它对 shell 或 ls 没有影响。在某些时候,ls 会堵塞尝试写入终端,因为终端没有读取数据。这意味着writels进程中的系统调用将花费很长时间,这与信号无关。

有一种方法可以将信号传递给具有父子关系的一组进程,但这是由调用者决定的,而不是由信号的接收者决定的,并且该组进程必须是进程组。进程组的目的是能够向整个 shell 作业发送信号,即使该作业由多个进程(例如管道)组成。

相关内容