Terminal 进程接收SIGTTIN/TTOU而不是阻塞的历史原因是什么?

Terminal 进程接收SIGTTIN/TTOU而不是阻塞的历史原因是什么?,terminal,history,signals,Terminal,History,Signals,在unix中,从终端启动的进程(通常)如果是后台的,就不能读取或写入终端。在其他情况下,当进程无法读/写其终端(或其他文件描述符)时,它只是阻塞,并在读或写完成后继续运行。在后台进程的情况下,它接收SIGTTIN或sigttoo,这在默认情况下会挂起进程。如果该过程后来被预先确定,shell将继续它 为什么这种行为被设计成这样?阻塞文件描述符比信号更容易处理,因为它们通常根本不需要特殊处理。在涉及TTY的其他情况下(例如,如果与终端的连接无法处理数据速率),进程只是阻塞。如果一个过程需要了解这一

在unix中,从终端启动的进程(通常)如果是后台的,就不能读取或写入终端。在其他情况下,当进程无法读/写其终端(或其他文件描述符)时,它只是阻塞,并在读或写完成后继续运行。在后台进程的情况下,它接收SIGTTIN或sigttoo,这在默认情况下会挂起进程。如果该过程后来被预先确定,shell将继续它

为什么这种行为被设计成这样?阻塞文件描述符比信号更容易处理,因为它们通常根本不需要特殊处理。在涉及TTY的其他情况下(例如,如果与终端的连接无法处理数据速率),进程只是阻塞。如果一个过程需要了解这一点,它可以检查它是否是预先确定的。当时这种设计有什么优点吗


当然,这种行为现在是posix的一部分,所以现在它是因为“历史原因”而固定的,但是这些历史原因是什么呢

shell生成的进程通常将其stdin/stdout/stderr直接连接到终端。这使得程序可以做一些神奇的事情,比如改变终端设置、字体、键盘输入模式等

因此,如果进程没有暂停,它们仍然会尝试读取键盘输入


了解此逻辑的进程随后可以侦听信号,并在没有真正回答问题的背景下禁用I/O。为什么不制作I/O块呢?当多个程序试图从同一字符资源中读取(在块模式下)数据时,哪个进程接收数据是随机的(在某种程度上)。就拿这个例子来说。两个进程都试图读取相同的资源。进程A接收其中一个字符并开始对其进行处理,而进程B接收第二个字符,因为进程A由于其处理而在短时间内没有读取。