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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top