.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2005 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PIPE 7 "15 сентября 2017 г." Linux "Руководство программиста Linux" .SH ИМЯ pipe \- обзор каналов и FIFO .SH ОПИСАНИЕ Каналы и FIFO (также называемые именованными каналами) предоставляют двунаправленный канал обмена между процессами. У канала имеется \fIконец для чтения\fP (read end) и \fIконец для записи\fP (write end). Данные, записанные в конец для записи, можно прочитать из конца для чтения. .PP Канал создаётся с помощью вызова \fBpipe\fP(2), который образует новый канал и возвращает два файловых дескриптора, один указывает на конец для чтения, а другой на конец для записи. Каналы можно использовать для создания канала обмена между процессами; пример смотрите в \fBpipe\fP(2). .PP У FIFO (сокращение от First In First Out, первым вошёл, первым вышел) имеется имя в файловой системе (создаётся с помощью \fBmkfifo\fP(3)), и такой канал открывается с помощью \fBopen\fP(2). Любой процесс может открыть FIFO, если это ему разрешено правами на файл. Конец для чтения открывается при указании флага \fBO_RDONLY\fP; конец для записи открывается при указании флага \fBO_WRONLY\fP. Подробней смотрите \fBfifo\fP(7). \fIЗамечание\fP: хотя у FIFO есть путь в файловой системе, при вводе\-выводе из FIFO не используются операции с нижележащим устройством (если оно есть). .SS "Ввод\-вывод из каналов и FIFO" Каналы и FIFO отличаются только способом создания и открытия. После выполнения этих задач, ввод\-вывод из каналов и FIFO имеет одинаковую семантику. .PP Если процесс пытается выполнить чтение из пустого канала, то \fBread\fP(2) заблокирует выполнение в ожидании данных. Если процесс пытается выполнить запись в заполненный канал (смотрите далее), то \fBwrite\fP(2) заблокирует выполнение до тех пор, пока из канала не будут прочитаны данные, чтобы можно было записать ожидающие. Возможен неблокируемый ввод\-вывод с помощью вызова \fBfcntl\fP(2) с операцией \fBF_SETFL\fP, включающей флаг \fBO_NONBLOCK\fP в состоянии открытого файла. .PP Канал обмена, предоставляемый каналом, является \fIпотоком байт\fP: какие\-либо границы сообщений отсутствуют. .PP Если все файловые дескрипторы, указывающие на конец канала для записи, были закрыты, то попытка выполнить \fBread\fP(2) из канала возвратит конец файла (\fBread\fP(2) вернёт 0). Если все файловые дескрипторы, указывающие на конец канала для чтения, были закрыты, то \fBwrite\fP(2) завершится сигналом \fBSIGPIPE\fP, который будет послан вызывающему процессу. Если вызывающий процесс игнорирует этот сигнал, то \fBwrite\fP(2) завершится ошибкой \fBEPIPE\fP. Приложение, использующее \fBpipe\fP(2) и \fBfork\fP(2), должно использовать правильные вызовы \fBclose\fP(2) для закрытия ненужных копий файловых дескрипторов; это обеспечит появления конца файла и доставку \fBSIGPIPE\fP/\fBEPIPE\fP в подходящий момент. .PP Для канала невозможно вызвать \fBlseek\fP(2). .SS "Ёмкость канала" Канал имеет ограниченную ёмкость. Если канал переполнен, то \fBwrite\fP(2) заблокируется или завершится с ошибкой, в зависимости от наличия флага \fBO_NONBLOCK\fP (смотрите далее). В различных реализациях разные ограничения на ёмкость канала. Приложения не должны полагаться на определённую величину: их нужно разрабатывать так, чтобы читающий процесс перерабатывал данные как только они появляются, чтобы пишущий процесс не блокировался. .PP В Linux до версии 2.6.11, ёмкость канала была равна размеру системной страницы (4096 байт на i386). Начиная с Linux 2.6.11, ёмкость канала равна 16 страницам (т. е., 65536 байтам в системе с размером страницы в 4096 байта). Начиная с Linux 2.6.35, ёмкость канала по умолчанию равна 16 страницам, но это значение можно прочитать и изменить с помощью вызова \fBfcntl\fP(2) с операциями \fBF_GETPIPE_SZ\fP и \fBF_SETPIPE_SZ\fP. Подробности смотрите в \fBfcntl\fP(2). .PP Следующая операция \fBioctl\fP(2), которая может быть применена к файловому дескриптору, указывающему на любой конец канала, помещает количество непрочитанных байт канала в буфер \fIint\fP, задаваемый последним аргументом вызова: .PP ioctl(fd, FIONREAD, &nbytes); .PP .\" Операция \fBFIONREAD\fP отсутствует в стандартах, но имеется во многих реализациях. .SS "Файлы в /proc" В Linux управление количеством памяти каналов осуществляется через следующие файлы: .TP \fI/proc/sys/fs/pipe\-max\-pages\fP (только в Linux 2.6.34) .\" commit b492e95be0ae672922f4734acf3f5d35c30be948 Верхнее ограничение (в страницах) ёмкости, которое непривилегированный пользователь (без мандата \fBCAP_SYS_RESOURCE\fP) может задать для канала. .IP Значение по умолчанию этого ограничения равно 16 кратному размеру ёмкости канала по умолчанию (смотрите выше); нижнее ограничение равно 2м страницам. .IP Данный интерфейс удалён в Linux 2.6.35; его заменяет \fI/proc/sys/fs/pipe\-max\-size\fP. .TP \fI/proc/sys/fs/pipe\-max\-size\fP (начиная с Linux 2.6.35) .\" commit ff9da691c0498ff81fdd014e7a0731dab2337dac .\" This limit is not checked on pipe creation, where the capacity is .\" always PIPE_DEF_BUFS, regardless of pipe-max-size Максимальный размер (в байтах) отдельных каналов, который может быть установлен пользователем без мандата \fBCAP_SYS_RESOURCE\fP. Значение, записываемое в этот файл, может округлиться в большую сторону, отражая реальное значение, принятое для удобства реализации. Чтобы определить увеличенное значение, прочитайте содержимое этого файла после записи значения. .IP Значение по умолчанию равно 1048576 (1\ МиБ). Минимальное значение равно размеру системной страницы. При попытке задать меньшее значение вызов \fBwrite\fP(2) завершится ошибкой \fBEINVAL\fP. .IP .\" commit 086e774a57fba4695f14383c0818994c0b31da7c Начиная с Linux 4.9 значение в данном файле также служит верхним пределом ёмкости по умолчанию для новых каналов или открываемых FIFO. .TP \fI/proc/sys/fs/pipe\-user\-pages\-hard\fP (начиная с Linux 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 Жёсткое ограничение на общий размер (в страницах) всех каналов создаваемых или изменяемых одним непривилегированным пользователем (т. е., без мандата \fBCAP_SYS_RESOURCE\fP или \fBCAP_SYS_ADMIN\fP). Пока общее количество страниц, выделенных под буферы каналов для этого пользователя, равно этому ограничению, попытки создать новые каналы будут отклоняться, также как и попытки увеличить ёмкость канала. .IP .\" The default was chosen to avoid breaking existing applications that .\" make intensive use of pipes (e.g., for splicing). Если значение этого ограничения равно нулю (по умолчанию), то жёсткое ограничение не применяется. .TP \fI/proc/sys/fs/pipe\-user\-pages\-soft\fP (начиная с Linux 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 Мягкое ограничение на общий размер (в страницах) всех каналов создаваемых или изменяемых одним непривилегированным пользователем (т. е., без мандата \fBCAP_SYS_RESOURCE\fP или \fBCAP_SYS_ADMIN\fP). Пока общее количество страниц, выделенных под буферы каналов для этого пользователя, равно этому ограничению, отдельные каналы, создаваемые пользователем, будут ограничены одной страницей, а попытки увеличить ёмкость канала будут отклоняться. .IP Если значение этого ограничения равно нулю, то мягкое ограничение не применяется. По умолчанию значение в этом файле равно 16384, что позволяет создать до 1024 каналов с ёмкостью по умолчанию. .PP .\" До Linux 4.9 имелись дефекты, влияющие на обработку ограничений \fIpipe\-user\-pages\-soft\fP и \fIpipe\-user\-pages\-hard\fP; смотрите ДЕФЕКТЫ. .SS PIPE_BUF В POSIX.1 указано, что операция \fBwrite\fP(2) для записи меньше чем \fBPIPE_BUF\fP байт должна быть атомарна: выходные данные записываются в канал как непрерывная последовательность. Запись более \fBPIPE_BUF\fP байт может быть не атомарна: ядро может чередовать данные с данными, записываемыми другими процессами. В POSIX.1 требуется, чтобы значение \fBPIPE_BUF\fP было не менее 512 байт (в Linux, \fBPIPE_BUF\fP равно 4096 байт). Точная семантика зависит от вида блокированности файлового дескриптора (\fBO_NONBLOCK\fP), есть ли несколько писателей в канала и от \fIn\fP, количества записываемых байт: .TP \fBO_NONBLOCK\fP сброшен, \fIn\fP <= \fBPIPE_BUF\fP Все \fIn\fP байт записываются атомарно; \fBwrite\fP(2) может заблокироваться, если нет места для немедленной записи \fIn\fP байт .TP \fBO_NONBLOCK\fP установлен, \fIn\fP <= \fBPIPE_BUF\fP Если есть место для записи \fIn\fP байт в канал, то \fBwrite\fP(2) немедленно завершается без ошибки, записывая все \fIn\fP байт; в противном случае \fBwrite\fP(2) завершается с ошибкой, а \fIerrno\fP присваивается значение \fBEAGAIN\fP. .TP \fBO_NONBLOCK\fP сброшен, \fIn\fP > \fBPIPE_BUF\fP Запись не атомарна: данные, переданные во \fBwrite\fP(2), могут чередоваться с \fBwrite\fP(2) из других процессов; \fBwrite\fP(2) блокируется до тех пор, пока не будут записаны \fIn\fP байт. .TP \fBO_NONBLOCK\fP установлен, \fIn\fP > \fBPIPE_BUF\fP Если канала переполнен, то \fBwrite\fP(2) завершается с ошибкой, а \fIerrno\fP присваивается значение \fBEAGAIN\fP. В противном случае, может быть записано от 1 до \fIn\fP байт (т. е., может произойти «частичная запись»; вызывающий должен проверить возвращаемое значение \fBwrite\fP(2), чтобы узнать сколько байт действительно записано), и эти байты могут чередоваться с данными, записанными другими процессами. .SS "Флаги состояния открытого файла" К каналу и FIFO из флагов состояния открытого файла применимы только \fBO_NONBLOCK\fP и \fBO_ASYNC\fP. .PP Установка флага \fBO_ASYNC\fP для чтения от конца канала проводит к генерации сигнала (по умолчанию \fBSIGIO\fP) при появлении новых данных в канале. Получатель сигнала должен быть указан с помощью команды \fBF_SETOWN\fP вызовом \fBfcntl\fP(2). В Linux \fBO_ASYNC\fP поддерживается для каналов и FIFO только начиная с ядра версии 2.6. .SS "Замечания о переносимости" В некоторых системах (но не в Linux), каналы являются двунаправленными: данные можно передавать в обоих направлениях между концами канала. Согласно POSIX.1 требуются только однонаправленные каналы. Переносимые приложения не должны зависеть от семантики двунаправленных каналов. .SS ДЕФЕКТЫ .\" These bugs where remedied by a series of patches, in particular, .\" commit b0b91d18e2e97b741b294af9333824ecc3fadfd8 and .\" commit a005ca0e6813e1d796a7422a7e31d8b8d6555df1 До Linux 4.9 имелись дефекты, влияющие на обработку ограничений \fIpipe\-user\-pages\-soft\fP и \fIpipe\-user\-pages\-hard\fP при операции \fBfcntl\fP(2) \fBF_SETPIPE_SZ\fP по изменению ёмкости канала: .IP (1) 5 При увеличении ёмкости канала, проверки мягких и жёстких ограничений делались по существующему потреблению и не включали память, требуемую для увеличения ёмкости канала. Новое увеличение ёмкости канала в последствии могло превысить ограничение на общее количество памяти, используемой пользователем для каналов (это могло также вызвать проблему, описанную далее). .IP Начиная с Linux 4.9 при проверке ограничения добавляется память, требуемая под ёмкость нового канала. .IP (2) Проверки ограничения выполнялись даже, когда ёмкость нового канала была меньше чем ёмкость существующего канала. Это могло привести к проблемам, если пользователь устанавливал большую ёмкость канала, а затем ограничения снижались, и в результате этого пользователь больше не мог уменьшить ёмкость канала. .IP Начиная с Linux 4.9 проверки ограничений выполняются только когда ёмкость канала увеличивается; непривилегированный пользователь всегда может уменьшить ёмкость канала. .IP (3) Учёт и проверка ограничений выполнялись следующим образом: .IP .RS .PD 0 .IP (а) 4 Выполнялась проверка не превышает ли пользователь ограничение. .IP (б) Выделялся буфер под новый канал. .IP (в) Учитывалось новое выделение в ограничениях. .PD .RE .IP Это приводило к появлению состязательности. Несколько процессов могли пройти пункт (а) одновременно и затем выделить буферы канала, которое учитывалось только в шаге (в), что приводило к превышению пользовательского ограничения размера выделения буферов под канал. .IP Начиная с Linux 4.9, шаг учёта выполняется до выделения и операция завершается с ошибкой, если бы было превышение ограничения. .PP До Linux 4.9, дефекты подобные (1) и (3), также могли происходить, когда ядро выделяет память под буферы нового канала; то есть, когда вызывается \fBpipe\fP(2) и когда открывается ранее не открытый FIFO. .SH "СМ. ТАКЖЕ" \fBmkfifo\fP(1), \fBdup\fP(2), \fBfcntl\fP(2), \fBopen\fP(2), \fBpipe\fP(2), \fBpoll\fP(2), \fBselect\fP(2), \fBsocketpair\fP(2), \fBsplice\fP(2), \fBstat\fP(2), \fBtee\fP(2), \fBvmsplice\fP(2), \fBmkfifo\fP(3), \fBepoll\fP(7), \fBfifo\fP(7) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .