Есть ли последствия для того, чтобы многие процессы записывали в один ридер в именованном канале в posix? - PullRequest
8 голосов
/ 25 февраля 2009

Я пишу программу для POSIX (OSX), где у меня будет много процессов, отправляющих сообщения одному слушателю, который по сути является потоком журналирования. Все процессы выполняются в отдельных программах и используют один именованный канал (FIFO), в который записываются многие процессы, но чтение только из одного процесса очень заманчиво.

Вопросы:

1) Будет ли это работать? - Я могу сделать эту работу, используя bash для настройки fifo с записью в нее нескольких процессов, поэтому я знаю, что теоретически это работает. Но на практике, есть ли какие-то проблемы, о которых я говорю?

shell # 1

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

снаряды № 2 и № 3

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

2) Если каждый писатель пишет только относительно короткие сообщения (<100 байт?), То могу ли я предположить, что каждый вызов write () будет отправляться читателю полностью? Или половина одного сообщения может быть искажена с половиной другого сообщения от другого автора? </p>

спасибо за любой совет.

1 Ответ

11 голосов
/ 25 февраля 2009

Запись в FIFO должна быть атомарной, если она меньше размера страницы. Таким образом, не должно быть проблемы со 100-байтовыми сообщениями. В Linux максимальный размер был 4K, я считаю, что теперь он больше. Я использовал эту технику в нескольких системах для передачи сообщений, поскольку записи заканчиваются на атомарном.

Вы можете столкнуться с проблемой, если используете серию записей, поскольку буферизация вывода может вызвать проблему синхронизации. Поэтому убедитесь, что все сообщение написано за один раз. например. создайте строку, затем напечатайте, не печатайте сразу несколько фрагментов.

s="This is a message"
echo $s

НЕ

echo "This "
echo "is "
echo " a message"
...