2009-02-25 5 views
8

Sto scrivendo un programma per POSIX (OSX) in cui avrò molti processi che inviano messaggi a un listener, che è essenzialmente un thread di registrazione. Tutti i processi sono in esecuzione in programmi separati e utilizzano una singola named pipe (FIFO) a cui molti processi scrivono, ma solo un singolo processo di lettura è molto allettante.Ci sono ripercussioni sull'avere molti processi scritti su un singolo lettore su una named pipe in posix?

domande:

1) Funzionerà? - Posso farlo funzionare usando bash per configurare un fifo con più processi di scrittura, quindi so che in teoria funziona. Ma in pratica, ci sono problemi su cui sto sorvolando?

shell # 1

$ mkfifo /tmp/fifo 
$ cat /tmp/fifo 

conchiglie # 2 e # 3

$ cat > /tmp/fifo 
"Type stuff here, after hitting enter, it is read by shell #1" 

2) Se ciascuno scrittore scrive solo i messaggi relativamente brevi (< 100 byte?) Quindi posso supporre che ogni chiamata scrivere() sarà inviato al lettore nella sua interezza? O metà di un messaggio rischia di essere confuso con metà di un altro messaggio da un altro autore?

grazie per qualsiasi consiglio.

risposta

10

La scrittura FIFO deve essere atomica, purché si trovi sotto le dimensioni della pagina. Quindi non dovrebbe esserci un problema con i messaggi di 100 byte. Su Linux la dimensione massima era di 4K, credo che ora sia più grande. Ho usato questa tecnica su alcuni sistemi per il passaggio dei messaggi, dal momento che le scritture finiscono atomiche.

È possibile che si verifichi un problema, se si utilizza una serie di scritture, poiché il buffering dell'output potrebbe causare un problema di sincronizzazione. Quindi assicurati che l'intero messaggio sia scritto in una sola volta. per esempio. costruire una stringa, quindi stampare, non stampare più pezzi contemporaneamente.

s="This is a message" 
echo $s 

NON

echo "This " 
echo "is " 
echo " a message" 
+0

sei il benvenuto :) – sfossen