pipe(7) | Miscellaneous Information Manual | pipe(7) |
pipe - обзор каналов и FIFO
Каналы и FIFO (также называемые именованными каналами) предоставляют двунаправленный канал обмена между процессами. У канала имеется конец для чтения (read end) и конец для записи (write end). Данные, записанные в конец для записи, можно прочитать из конца для чтения.
Канал создаётся с помощью вызова pipe(2), который образует новый канал и возвращает два файловых дескриптора, один указывает на конец для чтения, а другой на конец для записи. Каналы можно использовать для создания канала обмена между процессами; пример смотрите в pipe(2).
У FIFO (сокращение от First In First Out, первым вошёл, первым вышел) имеется имя в файловой системе (создаётся с помощью mkfifo(3)), и такой канал открывается с помощью open(2). Любой процесс может открыть FIFO, если это ему разрешено правами на файл. Конец для чтения открывается при указании флага O_RDONLY; конец для записи открывается при указании флага O_WRONLY. Подробней смотрите fifo(7). Замечание: хотя у FIFO есть путь в файловой системе, при вводе-выводе из FIFO не используются операции с нижележащим устройством (если оно есть).
Каналы и FIFO отличаются только способом создания и открытия. После выполнения этих задач, ввод-вывод из каналов и FIFO имеет одинаковую семантику.
Если процесс пытается выполнить чтение из пустого канала, то read(2) заблокирует выполнение в ожидании данных. Если процесс пытается выполнить запись в заполненный канал (смотрите далее), то write(2) заблокирует выполнение до тех пор, пока из канала не будут прочитаны данные, чтобы можно было записать ожидающие. Возможен неблокируемый ввод-вывод с помощью вызова fcntl(2) с операцией F_SETFL, включающей флаг O_NONBLOCK в состоянии открытого файла.
Канал обмена, предоставляемый каналом, является потоком байт: какие-либо границы сообщений отсутствуют.
Если все файловые дескрипторы, указывающие на конец канала для записи, были закрыты, то попытка выполнить read(2) из канала возвратит конец файла (read(2) вернёт 0). Если все файловые дескрипторы, указывающие на конец канала для чтения, были закрыты, то write(2) завершится сигналом SIGPIPE, который будет послан вызывающему процессу. Если вызывающий процесс игнорирует этот сигнал, то write(2) завершится ошибкой EPIPE. Приложение, использующее pipe(2) и fork(2), должно использовать правильные вызовы close(2) для закрытия ненужных копий файловых дескрипторов; это обеспечит появления конца файла и доставку SIGPIPE/EPIPE в подходящий момент.
Для канала невозможно вызвать lseek(2).
Канал имеет ограниченную ёмкость. Если канал переполнен, то write(2) заблокируется или завершится с ошибкой, в зависимости от наличия флага O_NONBLOCK (смотрите далее). В различных реализациях разные ограничения на ёмкость канала. Приложения не должны полагаться на определённую величину: их нужно разрабатывать так, чтобы читающий процесс перерабатывал данные как только они появляются, чтобы пишущий процесс не блокировался.
Before Linux 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe capacity is 16 pages (i.e., 65,536 bytes in a system with a page size of 4096 bytes). Since Linux 2.6.35, the default pipe capacity is 16 pages, but the capacity can be queried and set using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations. See fcntl(2) for more information.
Следующая операция ioctl(2), которая может быть применена к файловому дескриптору, указывающему на любой конец канала, помещает количество непрочитанных байт канала в буфер int, задаваемый последним аргументом вызова:
ioctl(fd, FIONREAD, &nbytes);
Операция FIONREAD отсутствует в стандартах, но имеется во многих реализациях.
В Linux управление количеством памяти каналов осуществляется через следующие файлы:
До Linux 4.9 имелись дефекты, влияющие на обработку ограничений pipe-user-pages-soft и pipe-user-pages-hard; смотрите ДЕФЕКТЫ.
POSIX.1 says that writes of less than PIPE_BUF bytes must be atomic: the output data is written to the pipe as a contiguous sequence. Writes of more than PIPE_BUF bytes may be nonatomic: the kernel may interleave the data with data written by other processes. POSIX.1 requires PIPE_BUF to be at least 512 bytes. (On Linux, PIPE_BUF is 4096 bytes.) The precise semantics depend on whether the file descriptor is nonblocking (O_NONBLOCK), whether there are multiple writers to the pipe, and on n, the number of bytes to be written:
К каналу и FIFO из флагов состояния открытого файла применимы только O_NONBLOCK и O_ASYNC.
Setting the O_ASYNC flag for the read end of a pipe causes a signal (SIGIO by default) to be generated when new input becomes available on the pipe. The target for delivery of signals must be set using the fcntl(2) F_SETOWN command. On Linux, O_ASYNC is supported for pipes and FIFOs only since Linux 2.6.
В некоторых системах (но не в Linux), каналы являются двунаправленными: данные можно передавать в обоих направлениях между концами канала. Согласно POSIX.1 требуются только однонаправленные каналы. Переносимые приложения не должны зависеть от семантики двунаправленных каналов.
До Linux 4.9 имелись дефекты, влияющие на обработку ограничений pipe-user-pages-soft и pipe-user-pages-hard при операции fcntl(2) F_SETPIPE_SZ по изменению ёмкости канала:
Before Linux 4.9, bugs similar to points (a) and (c) could also occur when the kernel allocated memory for a new pipe buffer; that is, when calling pipe(2) and when opening a previously unopened FIFO.
mkfifo(1), dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2), splice(2), stat(2), tee(2), vmsplice(2), mkfifo(3), epoll(7), fifo(7)
Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Kogan, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
4 декабря 2022 г. | Linux man-pages 6.03 |