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