Necesito mi programa escrito en C puro para detener la ejecución cuando se cierra stdin.¿Cómo verificar si stdin aún está abierto sin bloqueo?
Hay un trabajo indefinido en el ciclo principal del programa, y no hay forma de que pueda usar controles de bloqueo (como getc()
) allí (no se espera que lleguen datos en stdin; solo permanece abierto para tiempo desconocido).
Tengo la intención de utilizar la funcionalidad descrita en la realización del daemon de red alojado en inetd, xinetd o sus análogos - debe emitir datos en stdout mientras la conexión permanece abierta y terminar correctamente el trabajo cuando se cierra. Ahora el servicio de alojamiento elimina mi programa, ya que no se detendrá después de la finalización de la conexión.
Me pregunto si fctntl()
con el indicador O_NONBLOCK
aplicado al descriptor stdin me permitiría usar la función read()
en modo no bloqueante? ¿Debo usar select()
de alguna manera?
P.S. La información no se supone, pero podría llegar a stdin. Una forma de lectura sin bloqueo sería una respuesta para la pregunta.
'poll' es exactamente lo que OP quiere, y su interfaz es un poco más fácil que' select' cuando se trata de un conjunto pequeño y fijo de descriptores de archivos. – ephemient