我cat
从终端开始:
$ cat
然后在第二个终端我发送停止信号:
$ kill -SIGSTOP $(pgrep cat)
一切正常 -cat
停止了。现在我想通过发送以下命令来唤醒此cat
进程SIGCONT
:
$ kill -SIGCONT $(pgrep cat)
什么都没发生。但是如果我fg
在第一个 shell 中使用cat
,则会被唤醒。为什么SIGCONT
不继续cat
执行?
答案1
在 shell 中按下“ctrl-Z”会向当前前台进程发送信号,从而暂停该进程STOP
。我相信,这还会导致进程的标准输入与 shell 分离 - 现在它已成为后台进程。
该bg
命令CONTINUE
向命令发送信号,但不会将其标准输入重新连接到 shell。由于 cat 正在等待标准输入,因此它保持停止状态。正如您所提到的,该fg
命令确实将标准输入重新连接到 shell。
当你STOP
向你的进程发送信号时,shell 会通过 CHILD 信号收到通知并将其置于后台,然后发生同样的事情。
当你按下“ctrl-Z”时你可以看到差异:
[1] + 8336 suspended cat
当您STOP
手动发送信号时:
[1] + 8336 suspended (signal) cat