进程为什么会收到SIGTTYIN/TTOU信号而不是阻塞的历史原因是什么?

3
在Unix中,从终端启动的进程如果被放到后台,通常就无法读取或写入其终端。在其他情况下,当进程无法读/写其终端(或其他文件描述符)时,它会简单地阻塞,并在读取或写入完成后继续运行。对于被放到后台的进程,它会收到SIGTTIN或SIGTTOU信号,这默认会挂起该进程。如果稍后将该进程置于前台,则shell会继续运行它。
为什么要设计成这样呢?阻塞文件描述符比信号容易处理得多,因为它们通常根本不需要特殊处理。在涉及终端连接无法处理数据速率等情况的其他情况下,进程只会被阻塞。如果进程需要知道这一点,它可以检查自己是否在前台。那么,这种设计当时有哪些优势呢?
当然,由于历史原因,这种行为现在已经成为POSIX的一部分,因此现在已经固定了。但是,这些历史原因是什么呢?
1个回答

0

Shell生成的进程通常直接连接到终端的stdin/stdout/stderr。这使得进程可以执行一些神奇的操作,比如更改终端设置、字体、键盘输入模式等。

因此,如果这些进程没有被挂起,它们仍然会尝试读取键盘输入。

了解这种逻辑的进程可以监听信号,并在后台运行时禁用I/O。


这并没有真正回答问题。为什么不制作I/O块呢? - melpomene
1
当多个程序尝试以阻塞模式从同一字符资源读取时,哪个进程接收数据将是随机的(在某种程度上)。举个例子,两个进程都尝试从同一资源读取。进程A接收到一个字符并开始处理它,而在处理过程中,由于进程A正在处理,因此进程B接收到第二个字符。 - Stian Skjelstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接