Менеджер каналов
pipe [-1] [-a размер_атомарной_записи] [-d] [-n имя_устройства] [-P] [-s размер_буфера_канала] &
_PC_PIPE_BUF
. Значение по умолчанию – 1 байт. Для получения информации о _PC_PIPE_BUF
см. раздел с описанием._PC_PIPE_BUF
. Значение по умолчанию – 5120 байтов. Для получения информации о _PC_PIPE_BUF
см. раздел с описанием./dev/pipe
. ЗОСРВ
«Нейтрино»
редакции 2020
ЗОСРВ «Нейтрино»
aarch64, arm, armv7, e2k, mips, ppc, x86
Для запуска этого сервиса необходимо войти в систему с учетной записью root. |
Менеджер каналов pipe реализует подмножество операций ввода/вывода в файлы, называемые каналами (или анонимными файлами FIFO). Представляя собой простую форму взаимодействия между процессами, каналы главным образом используются для соединения выхода одного процесса с входом другого процесса для формирования серии фильтров.
Для данной версии менеджера каналов pipe предусмотрена поддержка обратной совместимости. При вызове менеджера каналов pipe без аргументов поведение утилиты аналогично поведению более ранних версий pipe. |
Значение аргумента размер_атомарной_записи соответствует гарантированному размеру для записи данных с помощью функции write(), при котором записываемые данные не будут перемежаться с данными какого-либо другого процесса. Другими словами, это объем атомарно записываемых данных. Это необходимо при наличии нескольких записывающих процессов, передающих данные одному считывающему процессу. Максимальному значению согласно POSIX соответствует значение PIPE_BUF
; его можно запросить в течение времени выполнения с помощью команды fpathconf( _PC_PIPE_BUF ). Не рекомендуется устанавливать данное значение меньше значения по умолчанию, которое составляет 5120 байтов, если в коде прикладной программы используется явная переменная PIPE_BUF
из файла , а не определение во время выполнения с помощью функции fpathconf().
Значение аргумента размер_буфера_канала определяет общий размер буфера канала (и оно должно быть не меньше атомарного размера для операции записи). Он соответствует количеству (не считанных) байтов, успешное хранение которого может обеспечивать утилита pipe. При его превышении происходит блокировка или отказ клиентов write() с ошибкой EAGAIN
(в соответствии с их ориентацией O_NONBLOCK
).
Для запроса емкости буферизации канала отсутствует простой механизм (такой как fpathconf()). Но это значение можно определить с помощью записи в пустой канал O_NONBLOCK
по одному байту единовременно с подсчетом количества байтов, записанных до возвращения ошибки EAGAIN
(уведомление о заполнении канала). Увеличение этого значения может повысить эластичность конвейеров с точки зрения разделения записывающих и считывающих процессов за счет использования дополнительной системной памяти для каждого канала. В ряде ОС емкость буфера канала находится в диапазоне от 4 КБ до 16 КБ.
В целях строгого соблюдения POSIX необходимо обеспечить обновление атрибутов FIFO atime и mtime при выполнении каждой операции чтения read() и записи write(). Поскольку каналы FIFO перенаправляют доступ к FIFO из файловой системы хоста на сервер каналов, для установки этих атрибутов требуется передача дополнительных сообщений синхронизации из сервера каналов обратно в файловую систему хоста. В большинстве случаев такой уровень синхронизации не требуется, и по умолчанию синхронизация выполняется только при вызове последней функции FIFO close(). Для обеспечения строгого соответствия POSIX следует указать опцию -P.
Опция -1 определяет поведение для уведомления о записи select() утилиты pipe. Исходное поведение заключалось в обслуживании или разблокировании запросов клиентов select() даже в случае доступности только 1 байта буферного пространства. POSIX определяет другое поведение. Поскольку и атомарный размер для операции записи, и полный размер буфера составляют 5120 байтов, запрос select() будет обслужен только в том случае, если канал пуст, что может повлиять на производительность или привести к фиксированным задержкам между операциями записи и чтения. При установке этой опции для опции -s также следует задать значение, превышающее PIPE_BUF
, в целях исключения необходимости полного освобождения канала перед обслуживанием запроса на запись select().
Работа утилиты pipe завершается только при возникновении ошибки во время запуска. В случае отказа во время запуска утилита pipe выводит диагностическое сообщение в стандартный поток вывода и завершает работу с ненулевым статусом.
Базовые подсистемы ЗОСРВ «Нейтрино»
Предыдущий раздел: Сервисы