2009-02-24 13 views
17

Si tengo un programa que crea e intenta abrir un conducto con nombre usando mkfifo, ¿cómo puedo abrir un conducto para leer o escribir sin bloquear?¿Cómo realizo un fopen sin bloqueo en una tubería con nombre (mkfifo)?

Específicamente, estoy escribiendo un programa en C que se puede ejecutar con o sin gui (escrito en Java).

En el programa C, se crea con éxito las canalizaciones con nombre usando mkfifo, sin embargo cuando lo haga

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/ 

fopen no vuelve hasta que la interfaz gráfica de usuario que abre la tubería para la escritura. Lo que deseo hacer es tener esa tubería lista para ser leída una vez (si) la GUI decide escribir en ella - Colocaré el descriptor de archivo en una llamada select(). Es razonable esperar que la GUI java nunca se inicie realmente, por lo que no puedo confiar en que abra el otro extremo de la tubería en ningún punto específico o incluso en absoluto.

También tendré una segunda pipa abierta para escribir, y supongo que tendré el mismo problema. Además, no puedo configurar O_NONBLOCK en una tubería de salida que no tiene lector.

¿Alguna sugerencia?

(Esto se ejecuta en un sistema Linux)

+0

¿Necesita abrir la tubería de salida antes de seleccionar() disparar en la tubería de entrada? –

+0

@tinkertim - Supongo que técnicamente no: los configuré a ambos en una función de configuración, pero podría simplemente configurar primero el conducto de salida y luego llamar a seleccionar, ¿por qué? – Zxaos

Respuesta

12

Se podría open() su tubo de O_RDONLY | O_NONBLOCK, y si desea que el flujo C, lo puede conseguir con fdopen(). Sin embargo, podría haber un problema con el select() - AFAIK, un tubo abierto para lectura que no tiene escritor siempre preparado para la lectura, y read() devuelve 0, por lo que el select() se dispararía indefinidamente.

Una manera kludgy de superar esto sería abrir la tubería O_RDWR; es decir, tener al menos un escritor (su programa C++). Lo cual resolvería tu problema de todos modos.

+1

Voy a dar una oportunidad para el lector, pero no puedo configurar O_NONBLOCK en una tubería de salida ... – Zxaos

+1

El estándar POSIX dice (de select()): "Un descriptor se considerará listo para la lectura cuando una llamada a una función de entrada con O_NONBLOCK clear no se bloquearía, independientemente de si la función transferiría datos con éxito o no ". (POSIX.1: 2008). –

+1

Al abrir la tubería O_RDWR se produciría un interbloqueo cuando el programa lea (o escriba), a menos que haya otro proceso también con la tubería abierta. –

Cuestiones relacionadas