2009-02-25 18 views
8

Je suis en train d'écrire un programme pour POSIX (OSX) où de nombreux processus enverront des messages à un écouteur, qui est essentiellement un thread de journalisation. Tous les processus s'exécutent dans des programmes séparés et utilisent un seul tube nommé (FIFO) sur lequel de nombreux processus écrivent, mais un seul processus est très tentant.Y a-t-il des répercussions sur le fait que de nombreux processus écrivent sur un seul lecteur sur un tube nommé dans Posix?

Questions:

1) Cela fonctionnera-t-il? - Je peux faire ce travail en utilisant bash pour mettre en place un fifo avec de multiples processus d'écriture, donc je sais qu'en théorie cela fonctionne. Mais en pratique, y a-t-il des problèmes que je glisse?

shell # 1

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

coquilles # 2 et # 3

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

2) Si chaque auteur écrit que les messages relativement courts (< 100 octets?) Alors je peux supposer que chaque appel écrire() sera envoyé au lecteur dans son intégralité? Ou la moitié d'un message risque-t-elle d'être brouillée avec la moitié d'un autre message d'un autre auteur?

merci pour tout conseil.

Répondre

10

L'écriture FIFO doit être atomique, tant qu'elle est inférieure à la taille de la page. Il ne devrait donc pas y avoir de problème avec les messages de 100 octets. Sur linux, la taille maximale était 4K, je crois qu'elle est plus grande maintenant. J'ai utilisé cette technique sur quelques systèmes pour passer des messages, puisque les écritures finissent par être atomiques.

Vous pouvez vous retrouver avec un problème, si vous utilisez une série d'écritures, car la mise en mémoire tampon de sortie peut provoquer un problème de synchronisation. Assurez-vous donc que le message entier est écrit en même temps. par exemple. Construire une chaîne, puis imprimer, ne pas imprimer plusieurs pièces à la fois.

s="This is a message" 
echo $s 

PAS

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

vous êtes les bienvenus :) – sfossen