像bc这样的Unix程序在作为后台作业启动时如何干净地处理输入/输出流?

noj0wjuj  于 2022-12-23  发布在  Unix
关注(0)|答案(1)|浏览(154)

我注意到Unixbc程序没有打印出它通常的提示符(三个符号“〉〉〉“)作为后台进程启动时(就像如果你把它作为“BC &”执行一样)。这让我很困惑,因为从我对Unix有限的了解来看,作为后台作业启动一个程序会让它一直运行,直到它一试图从Stdin读取,在该点它将接收到停止自身的信号。
但是把bc作为后台工作(“bc &”)不会导致它在停止之前至少打印出“〉〉〉“提示符,这告诉我程序以某种方式处理了这一点。我很好奇它是如何做到这一点的。当我写了一个幼稚的程序,只试图模拟输入/输出交互时,在挂起之前,它仍然会打印出“〉〉〉“,这看起来一点也不干净,而且在某些shell上,这种行为甚至会变得更加奇怪。
我试着浏览Unix bc源代码,我能够跟踪代码到打印“〉〉〉“提示符的部分,但是当作为后台进程启动时,它是如何处理不打印提示符的。我知道,显然您永远不会在后台启动输入/输出交互式程序,因为这违背了预期的功能和常识。但我更感兴趣的是它背后的概念,如这是否是用信号处理实现的和/或这是否是一些更高级的输入/输出流缓冲或一些其他我不熟悉的Unix概念。

mzmfm0qo

mzmfm0qo1#

您的bc版本要做的第一件事是调用tcsetattr函数,当从后台进程调用此函数时,会将SIGTTOU信号发送到进程,默认情况下会导致进程停止。
任何处理终端属性的程序(vim、bash、任何使用readlinecurses的程序......)的行为可能完全相同。

相关问题