Что такое гарантии параллельных записей в именованный канал?

В первую очередь, Вы не являетесь одними (поток списка рассылки по проблеме).

От него я собрал это natd по-видимому, был единственный выбор до FreeBSD 7.x и что страница руководства, Вы сослались, вероятно, на пересмотр потребностей (см. это сообщение) и NAT в ядре возможно быстрее.

Кроме этого, оба решения все еще кажутся прекрасными (оба присутствуют в стандартной установке FreeBSD, в конце концов), и обычные kernelspace/userspace аргументы применяют... не самый удовлетворительный ответ, извините.

32
16.03.2013, 12:33
1 ответ

Это зависит от того, сколько пишет каждый процесс (предположение, что Ваша ОС совместима POSIX в этом отношении). От write():

Запишите запросы в канал, или FIFO должен быть обработан таким же образом как регулярный файл за следующими исключениями:
[...]

  • Запишите запросы байтов {PIPE_BUF}, или меньше не должно быть чередовано с данными из других процессов, делающих записи на том же канале. Записям больших, чем байты {PIPE_BUF} могли чередовать данные, на произвольных границах, с записями другие процессы, установлен ли флаг O_NONBLOCK флагов состояния файла.

Также в разделе Rationale относительно каналов и FIFOs:

  • Atomic/non-atomic: запись является атомарной, если целая сумма, записанная в одной операции, не чередована с данными ни из какого другого процесса. Это полезно, когда существует несколько устройств записи, отправляющих данные единственному читателю. Приложения должны знать, как большой запрос записи, как могут ожидать, будет выполнен атомарно. Этот максимум называют {PIPE_BUF}. Этот объем POSIX.1-2008 не говорит, являются ли запросы записи на больше, чем байты {PIPE_BUF} атомарными, но требует, чтобы записи {PIPE_BUF} или меньшего количества байтов должны быть атомарными.

Значение, если PIPE_BUF определяется каждой реализацией, но минимум составляет 512 байтов (см. limits.h). На Linux это - 4 096 байтов (см. pipe(7)).

29
27.01.2020, 19:37
  • 1
    PIPE_BUF, как, между прочим, гарантируют, будет по крайней мере 512. Обратите внимание, что также необходимо гарантировать, что процесс на самом деле пишет каждую строку в него в единственном вызове записи. Включение буферизации строки (setvbuf(stdout, NULL, _IOLBF,512)) сделает это, не требуя, чтобы Вы использовали функции низкого уровня. –  Random832 16.03.2013, 23:41
  • 2
    Здесь является таблицей наблюдаемых PIPE_BUF значения в общих системах Unix: ar.to/notes/posix#pipe-buf –  Arto Bendiken 08.10.2014, 02:52
  • 3
    , который я не понимаю, как сокеты могут быть мультиплексированы..., но именованные каналы, не может?? все на Unix - просто право файла? lulz –  Alexander Mills 20.04.2018, 12:23
  • 4
    @AlexanderMills: Я не понимаю Ваш комментарий –  Mat 20.04.2018, 14:34

Теги

Похожие вопросы