Jak sprawdzić, czy stdin jest nadal otwarty bez blokowania?
Potrzebuję mojego programu napisanego w czystej C, aby zatrzymać wykonywanie, gdy stdin jest zamknięty.
W cyklu głównym programu jest wykonywana praca na czas nieokreślony i nie ma możliwości użycia kontroli blokowania (npgetc()
) tam (żadne dane nie powinny dotrzeć na standardowe wejście - po prostu pozostaje otwarte przez nieznany czas).
Zamierzam wykorzystać opisaną funkcjonalność w realizacji demona sieciowego hostowanego w inetd, xinetd lub ich analogach - powinien on emitować dane na stdout, podczas gdy połączenie pozostaje otwarte i poprawnie zakończyć pracę po jej zamknięciu. Teraz mój program zostaje zabity przez usługę hostingową, ponieważ nie zatrzyma się po zakończeniu połączenia.
zastanawiam się czyfctntl()
zO_NONBLOCK
flaga zastosowana do deskryptora stdin pozwoli mi użyćread()
funkcja w trybie nieblokującym? Powinienem użyćselect()
jakoś?
P.S. Dane nie są przypuszczalne, ale mogą dotrzeć do standardowego wejścia. Sposób odczytu bez blokowania byłby odpowiedzią na pytanie.