为什么“yes&”会使我的 Bash 会话崩溃?

为什么“yes&”会使我的 Bash 会话崩溃?

“是的,而且……”是即兴喜剧中的一个精彩的经验法则。在 UNIX 世界中则不然。

当我运行这个公认的愚蠢yes&命令时,我无法中断它。终端崩溃或陷入循环。

我希望该yes进程立即暂停,因为如果尝试写入标准输出,后台的任何进程都应该暂停,但情况似乎并非如此,我想知道为什么。

答案1

仅当设置了输出模式时,写入终端的后台进程才会被挂起TOSTOP,默认情况下并非如此。尝试

stty tostop
yes &

你会看到它yes被暂停了。

后台进程默认情况下,来自终端的操作会被暂停,因为没有明智的方法让它们获得正确的输入。

GNU C 库手册中有关访问终端的部分

关闭后TOSTOP,终端不会崩溃或卡住,它仍然对输入做出响应;因此,您可以yes通过杀死它(kill %如果它是唯一的后台作业)或将其带到前台(fg)并停止它(CtrlC)来停止后台。您必须盲目输入命令,但它们会起作用。

答案2

斯蒂芬的回答非常好,但我想补充一点,您可以通过将进程置于前台然后中断它来重新获得对 bash 会话的控制:

$ yes &
y
y
y
y
...

尽管您看不到它,但请输入:

fgEnter进而Ctrl-C

fg是将后台作业移回前台的作业控制命令,当然,还会向当前作业Ctrl-C发送信号。SIGINT如果您有多个后台作业,fg则可以在后面跟一个jobspec参数来规定您想要将哪个作业移到前台。详细信息在bash手册页中。

相关内容