2015-12-29 2 views
0

Я прочитал Linux manpage pipe2, в котором говорится, что вы можете использовать флаг O_DIRECT для создания канала, который выполняет ввод/вывод в пакетном режиме.Fifos в Linux в пакетном режиме

Я не нашел ничего похожего на fifos (named pipes), хотя я слышал, что трубы и фифы имеют много кода в Linux, и это может быть полезно для меня в проекте (мы уже передаем сообщения в fifos , но мы должны искать особенного терминатора, читающего по одному байту за раз).

Есть ли что-то эквивалентное для выполнения ввода/вывода fifo в пакетном режиме?

ответ

1

The O_* флаги дескриптора файла, как правило, могут быть изменены fcntl(fd, F_SETFL, ...), но в данном случае я не думаю, что он будет работать, из-за этого:

https://lkml.org/lkml/2015/12/15/480

Это патч, который был представлен только 2 недели назад, чтобы поддержать именно этот вариант использования, и единственные ответы на него - это пара сбоев сборки от автоматизированного тестера.

Таким образом, вы можете попробовать фиксируя этот патч и применить его (должен быть легким - выглядит как опечатка, то f должен быть filp) ...

или (этот вариант я предпочел бы) увидеть, если ваши потребности могут быть выполнены с помощью разъема AF_UNIX, SOCK_SEQPACKET вместо трубы с этим новым флагом. Они более мощные и более портативные.

(я предполагаю, что вы уже пробовали прохождения O_DIRECT к open при открытии именованного канала, так как это самая очевидная вещь.)

1

Оба pipe & fifo являются поток байтов, это открыть file descriptor, а затем использовать read() и write() сделать связь.

Если у вас есть packet (я не уверен, что означает u, я предполагаю, что вы хотите прочитать блок данных, не определяя границу самостоятельно), POSIX - message queue может быть хорошим выбором. Он отправляет/принимает данные в блоке сообщения вместо байта по байту.

И вы также можете установить priority на сообщения, которые меняют порядок получения, если все сообщения имеют одинаковый приоритет (например, 0), тогда заказ на отправку & будет таким же, как FIFO.

Если это то, что вам нужно, а затем уточните man mq_overview.

+0

Ну, я знаю о очередях сообщений POSIX и System V, но они не прозрачны для приложений (их нельзя открывать и использовать как обычные файлы). Также мне сказали, что очереди сообщений POSIX имеют минимальные ограничения по умолчанию для сообщений и размера, поэтому они не очень полезны. – Mabus

+0

Пределы по умолчанию минимальны, но полностью настраиваются (просто измените файл), особенно для «привилегированного процесса». Поскольку FIFO не подходит для параллельного программирования, поэтому нецелесообразно иметь несколько клиентов, и, следовательно, данные не должны быть такими. Также, если вы хотите обмениваться данными, зачем их нужно открывать, как обычные файлы ... –

Смежные вопросы