Come si esegue un fopen non-blocking su una named pipe (mkfifo)?
-
06-09-2019 - |
Domanda
Se ho un programma che crea e tenta di aprire una named pipe utilizzando mkfifo, come posso aprire un tubo per la lettura o la scrittura senza bloccare?
In particolare, sto scrivendo un programma in C che può essere eseguito con o senza una GUI (scritto in Java).
Nel programma C, creo con successo le named pipe utilizzando mkfifo, tuttavia quando faccio
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
fopen non tornare fino a quando l'interfaccia grafica si apre quel tubo per la scrittura. Quello che desidero fare è avere quel tubo pronto per essere letto una volta (se) l'interfaccia grafica decide di scrivere ad esso - sarò mettendo il descrittore di file in una chiamata select (). E 'ragionevole aspettarsi che la GUI Java non può mai essere effettivamente iniziata, quindi non può fare affidamento su di esso per aprire l'altra estremità del tubo in qualsiasi punto specifico o addirittura a tutti.
avrò anche un secondo condotto aperto in scrittura, e assumere avrò lo stesso problema. Inoltre, non è possibile impostare O_NONBLOCK su un tubo di uscita che non ha lettore.
Qualche suggerimento?
(Questo è in esecuzione su un sistema Linux)
Soluzione
Si potrebbe open()
tua O_RDONLY | O_NONBLOCK
pipe, e se si desidera che il flusso di C, si può ottenere con fdopen()
. Tuttavia, ci potrebbe essere un problema con il select()
-. Per quanto ne so, un tubo fd aperto per la lettura che non ha nessuno scrittore è sempre pronto per la lettura, e read()
restituisce 0, in modo che il select()
avrebbe sparato a tempo indeterminato
Un modo kludgy superare questo sarebbe di aprire il O_RDWR
tubo; cioè, avere almeno un produttore (il programma C ++). Che risolverebbe il problema in ogni caso.