Как проверить, открыт ли stdin без блокировки?
Мне нужна моя программа, написанная на чистом C, чтобы остановить выполнение, когда stdin закрыт.
В основном цикле программы выполняется неопределенная работа, и я не могу использовать блокирующие проверки (например,getc()
) (данные не должны поступать на стандартный ввод данных - он остается открытым в течение неизвестного времени).
Я намереваюсь использовать описанную функциональность при реализации сетевого демона, размещенного в inetd, xinetd или их аналогах - он должен выдавать данные на стандартный вывод, пока соединение остается открытым, и корректно завершать работу после его закрытия. Теперь моя программа убита хостингом, так как она выигралаt останавливаться после прекращения соединения.
Интересно, еслиfctntl()
сO_NONBLOCK
флаг, примененный к дескриптору стандартного ввода, позволит мне использоватьread()
функционировать в неблокирующем режиме? Должен ли я использоватьselect()
каким-то образом?
Постскриптум Данные не предполагаются, но могут поступать в стандартный ввод данных. Способ неблокирующего считывания мог бы стать ответом на этот вопрос.