Есть ли какие-то последствия для множества процессов, записывающих в один считыватель именованного канала в posix?

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

Вопросов:

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

оболочка # 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 () будет полностью отправлен читателю? Или половина одного сообщения окажется под угрозой искажения с половиной другого сообщения от другого автора?

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


person Aftermathew    schedule 25.02.2009    source источник


Ответы (1)


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

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

s="This is a message"
echo $s

НЕТ

echo "This "
echo "is "
echo " a message"
person sfossen    schedule 25.02.2009