2009-02-24 11 views
17

Se ho un programma che crea e tenta di aprire una named pipe usando mkfifo, come posso aprire una pipe per leggere o scrivere senza bloccare?Come si esegue una fopen non bloccante su una named pipe (mkfifo)?

In particolare, sto scrivendo un programma C che può essere eseguito con o senza un 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 restituisce fino a quando l'interfaccia grafica si apre quel tubo per la scrittura. Quello che desidero fare è che la pipe sia pronta per essere letta una volta (se) la GUI decida di scriverla - inserirò il descrittore di file in una chiamata select(). È ragionevole aspettarsi che la GUI java non venga mai effettivamente avviata, quindi non posso fare affidamento su di essa per aprire l'altra estremità della pipa in un punto specifico o addirittura del tutto.

Avrò anche una seconda pipe aperta per la scrittura e presumo che avrò lo stesso problema. Inoltre, non posso impostare O_NONBLOCK su una pipe di uscita senza lettore.

Qualche suggerimento?

(Questo è in esecuzione su un sistema Linux)

+0

È necessario aprire il tubo di uscita prima di selezionare() l'accensione sul tubo di ingresso? –

+0

@tinkertim - Suppongo tecnicamente no - Avevo impostato entrambi in una funzione di configurazione, ma potevo semplicemente impostare il tubo di uscita prima e poi chiamare select, perché? – Zxaos

risposta

12

Si potrebbe open() la pipa O_RDONLY | O_NONBLOCK, e se si desidera che il flusso di C, si può ottenere con fdopen(). Tuttavia, potrebbe esserci un problema con lo select() - AFAIK, una pipe aperta per la lettura che non ha scrittore sempre pronto per la lettura, e read() restituisce 0, quindi select() si avvierà all'infinito.

Un modo semplice per superare questo sarebbe aprire il tubo O_RDWR; cioè, avere almeno uno scrittore (il tuo programma C++). Quale risolverebbe comunque il tuo problema.

+1

Darò uno scatto per il lettore - ma non posso impostare O_NONBLOCK su una pipe di uscita ... – Zxaos

+1

Lo standard POSIX dice (di select()): "Un descrittore deve essere considerato pronto per la lettura quando si chiama a una funzione di input con O_NONBLOCK clear non si bloccherebbe, indipendentemente dal fatto che la funzione possa trasferire i dati correttamente. " (POSIX.1: 2008). –

+1

L'apertura del tubo O_RDWR porterebbe a deadlock quando il programma legge (o scrive) - a meno che non ci sia effettivamente un altro processo anche con la pipe aperta. –