В unix процесс, запущенный с терминала, может (обычно) не читать или записывать на свой терминал, если он задан. В других случаях, когда процесс не может читать/записывать на свой терминал (или другой дескриптор файла), он просто блокирует и продолжает работать, как только чтение или запись могут быть завершены. В случае процесса, который используется в фоновом режиме, вместо него он получает SIGTTIN или SIGTTOU, который по умолчанию приостанавливает процесс. Если процесс позже перенаправляется, оболочка продолжает его.Каковы исторические причины процессов, получающих SIGTTYIN/TTOU вместо блокировки?
Почему такое поведение было таким? Блокировать дескрипторы файлов гораздо проще, чем сигналы, поскольку они часто не требуют специальной обработки вообще. В других случаях, связанных с tty (например, если соединение с терминалом не может обрабатывать скорость передачи данных), процессы просто блокируются. Если процесс должен был знать об этом, он мог бы проверить, был ли он набросок. Были ли в то время какие-либо преимущества для этого дизайна?
Конечно, это поведение теперь является частью posix, поэтому теперь оно фиксируется по «историческим причинам», но каковы были эти исторические причины?
Это не реально ответить на этот вопрос. Почему бы не сделать блок ввода-вывода? – melpomene
Когда несколько программ пытаются читать (в режиме блокировки) из одного и того же ресурса символов, это будет случайным (в некоторой степени), какой процесс получает данные. И возьмите этот пример. Два процесса пытаются читать из одних и тех же ресурсов. Процесс A получает один из символов и начинает его обрабатывать, а при обработке процесс B получает второй, так как процесс A в течение некоторого времени не считывается из-за его обработки. –