tuberias procesos pipes nombre fifos entre ejemplos ejemplo con comunicacion arbol c linux named-pipes blocking fifo

procesos - ¿Cómo realizo un fopen sin bloqueo en una tubería con nombre(mkfifo)?



tuberias con nombre en c (1)

Podrías open() tu tubería O_RDONLY | O_NONBLOCK O_RDONLY | O_NONBLOCK , y si quieres la transmisión C, puedes obtenerla con fdopen() . Sin embargo, podría haber un problema con select() - AFAIK, un fd abierto para la lectura que no tiene escritor siempre preparado para la lectura, y read() devuelve 0, por lo que select() se dispararía indefinidamente.

Una manera difícil 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.

Si tengo un programa que crea e intenta abrir un conducto con nombre utilizando mkfifo, ¿cómo puedo abrir un conducto para leer o escribir sin bloquear?

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

En el programa C, creo correctamente las canalizaciones con nombre utilizando mkfifo, sin embargo, cuando lo hago

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

fopen no regresa hasta que la GUI abre esa tubería para 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)