相关于信号手册页:
通过 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 会堵塞尝试写入终端,因为终端没有读取数据。这意味着write
ls进程中的系统调用将花费很长时间,这与信号无关。
有一种方法可以将信号传递给具有父子关系的一组进程,但这是由调用者决定的,而不是由信号的接收者决定的,并且该组进程必须是进程组。进程组的目的是能够向整个 shell 作业发送信号,即使该作业由多个进程(例如管道)组成。