Ответ на вопрос «Всегда ли stdout готов к записи» - «Это зависит».
stdout может быть подключен ко всему, что может быть открыто как дескриптор файла - например, к файлу диска, сетевому сокету или каналу. Обычный случай - это то, что он подключен к терминальному устройству.
Большинство этих типов файловых дескрипторов могут блокироваться при записи (что означает, что они не могут быть помечены как доступные для записи после возврата select()
), но обычно только в том случае, если вы просто записали в них очень большой объем данных (и залил какой-то буфер). «Большое количество» зависит от типа устройства - если ваш стандартный вывод - это 9600 бод последовательное устройство, то вы можете довольно легко заполнить буфер записи; Xterm, не так много.
Некоторое устройство никогда не блокирует , как файлы на диске, или /dev/null
, например. (write()
для файла на диске может завершиться не сразу, но это не считается «блокировкой» - это «ожидание диска»).