2009-02-25 11 views
8

Ich schreibe ein Programm für POSIX (OSX), in dem ich viele Prozesse habe, die Nachrichten an einen Listener senden, der im Wesentlichen ein Logging-Thread ist. Alle Prozesse werden in separaten Programmen ausgeführt, und die Verwendung einer einzelnen benannten Pipe (FIFO), in die viele Prozesse schreiben, von der nur ein einzelner Prozess liest, ist sehr verlockend.Gibt es Auswirkungen auf viele Prozesse in einem einzelnen Leser auf einem Named Pipe in Posix schreiben?

Fragen:

1) Funktioniert das? - Ich kann dies mit bash machen, um einen Fifo mit mehreren Prozessen zu erstellen, damit ich weiß, dass das funktioniert. Aber gibt es in der Praxis Probleme, die ich beschönige?

shell # 1

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

Schalen # 2 und # 3

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

2) Wenn jeder Schriftsteller nur relativ kurze Nachrichten schreibt (< 100 Bytes?) Kann dann gehe ich davon aus, dass jeder Anruf um zu schreiben() wird Wille zum Leser in seiner Gesamtheit gesendet? Oder wird die Hälfte einer Nachricht riskiert, mit der Hälfte einer anderen Nachricht eines anderen Schreibers verstümmelt zu werden?

danke für irgendeinen Rat.

Antwort

10

Der FIFO-Schreibvorgang sollte atomar sein, solange er unter der Seitengröße liegt. Es sollte also kein Problem mit 100-Byte-Nachrichten geben. Unter Linux war die maximale Größe 4K, ich glaube, es ist jetzt größer. Ich habe diese Technik auf einigen Systemen für die Weitergabe von Nachrichten verwendet, da die Schreibvorgänge atomar enden.

Sie können ein Problem haben, wenn Sie eine Reihe von Schreibvorgängen verwenden, da die Pufferung der Ausgabe zu einem Synchronisierungsproblem führen kann. Stellen Sie also sicher, dass die gesamte Nachricht auf einmal geschrieben wird. z.B. Erstellen Sie eine Zeichenfolge, drucken Sie dann, drucken Sie nicht mehrere Stücke gleichzeitig.

s="This is a message" 
echo $s 

NICHT

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

Sie sind willkommen :) – sfossen