Par exemple, j'ai créé un tuyau nommé comme ce qui suit:
mknod myPipe p
Et je l'ai lu à partir d'un processus (par exemple, un serveur). Par exemple, j'ai utilisé la queue:
tail -f myPipe
Si plusieurs processus clients écrivent des messages dans celui-ci (par exemple, echo "msg" >> myPipe
, y a-t-il des chances que des messages soient entrelacés, comme celui-ci:
<beginning of message1><message2><ending of message1>
Ou est-ce que le processus d'écriture à un tuyau nommé est atomique?
Cela dépend de la façon dont chaque processus écrit (en supposant que votre système d'exploitation soit conforme à la POSIX à cet égard). De write()
:
Écrire des demandes à un tuyau ou FIFO doit être traitée de la même manière qu'un fichier ordinaire avec les exceptions suivantes:
[...]
- Ecrire des demandes de {tuyau_buf} octets ou moins ne doit pas être entrelacé avec des données d'autres processus faisant des écrires sur le même tuyau. Les écrires de plus de {tuyau_buf} octets peuvent avoir des données entrelacées, sur des frontières arbitraires, avec écrit par d'autres processus, que l'indicateur O_NONBLOCK des indicateurs d'état du fichier est défini.
Également dans la section Justification Section En ce qui concerne les tuyaux et les FIFOS:
- atomique/non atomique: une écriture est atomique si l'ensemble du montant écrit en une seule opération n'est pas entrelacé avec des données d'un autre processus. Ceci est utile lorsque plusieurs écrivains envoient des données à un seul lecteur. Les applications doivent savoir comment une grande demande d'écriture peut être remplie atomiquement. Ce maximum est appelé {pipe_buf}. Ce volume de POSIX.1-2008 ne dit pas si des demandes d'écriture pour plus de {tuyau_buf} octets sont atomiques, mais nécessite que les écrivies de {tuyau_buf} ou moins d'octets doivent être atomiques.
La valeur si PIPE_BUF
Est définie par chaque implémentation, mais le minimum est de 512 octets (voir limits.h
). Sur Linux, il s'agit de 4096 octets (voir pipe(7)
).