Пайп в информатике и операционных системах¶
Пайп (от англ. pipe — труба) — в информатике и операционных системах механизм межпроцессного взаимодействия, обеспечивающий передачу потока данных от выхода одного процесса ко входу другого. Термин также обозначает сам канал передачи данных, создаваемый операционной системой, и синтаксическую конструкцию в командных оболочках, объединяющую программы в конвейер обработки данных.
¶Происхождение термина
Понятие пайпа появилось в ранних версиях Unix и восходит к работе Дугласа Макилроя (Douglas McIlroy) в Bell Labs в 1960-х годах. Идея заключалась в том, чтобы небольшие утилиты, каждая из которых выполняет одну простую операцию, можно было комбинировать в цепочки для решения сложных задач. Макилрой описал концепцию конвейерной обработки данных в меморандуме 1964 года, а первая реализация пайпов появилась в Unix версии 3 (1973). Символ | для обозначения конвейера в командной строке также был предложен Макилроя.
¶Механизм работы
Пайп реализуется операционной системой как анонимный канал (FIFO — First In, First Out). При создании пайпа ядро выделяет буфер в памяти (в классической реализации Unix его размер составляет 64 КБ) и два файловых дескриптора: один для чтения, другой для записи. Данные, записанные одним процессом в дескриптор записи, читаются другим процессом через дескриптор чтения. Запись в пайп блокируется, когда буфер заполнен; чтение — когда буфер пуст. Когда все записи в пайп закрыты, чтение возвращает признак конца файла (EOF).
В Linux пайпы реализованы через системные вызовы pipe() и pipe2(). В POSIX-системах поддерживается также именованный пайп (FIFO-файл), создаваемый командой mkfifo; такой файл существует в файловой системе и может использоваться для обмена данными между процессами, не являющимися родственниками.
¶Пайп в командных оболочках
В командных оболочках Unix-подобных систем (sh, bash, zsh, ksh) пайп записывается через символ вертикальной черты |, разделяющей команды:
`` команда1 | команда2 | команда3 ``
Стандартный поток вывода (stdout) первой команды перенаправляется на стандартный поток ввода (stdin) второй, и так далее по цепочке. Пример:
`` ps aux | grep nginx | wc -l ``
Эта команда подсчитывает количество процессов nginx: ps aux выводит список процессов, grep nginx отбирает строки, содержащие «nginx», а wc -l считает оставшиеся строки.
В Windows аналогичная функциональность реализована в командной оболочке cmd.exe (оператор |) и в PowerShell (оператор | как конвейер объектов). В PowerShell пайп передаёт не текстовые строки, а полноценные объекты .NET, что отличает его от текстовых конвейеров Unix.
¶Именованные пайпы
Именованный пайп (FIFO) представляет собой специальный файл в файловой системе, ведущий себя как канал передачи данных. В отличие от анонимного пайпа, именованный может использоваться произвольными процессами, запущенными в разное время. Создание:
`` mkfifo /tmp/канал ``
После создания файл можно открывать для записи одной программой и для чтения — другой. Именованные пайпы широко используются в Unix-системах для организации локального межпроцессного взаимодействия, например в системах инициализации (systemd) и демонах.
¶Пайпы в программировании
Помимо командной строки, пайпы предоставляются программистам как API межпроцессного взаимодействия. В стандартной библиотеке C функция pipe() создаёт анонимный канал; в Python модуль subprocess поддерживает параметр pipe=True для перенаправления потоков. В языке Haskell оператор |> и функции композиции потоков концептуально восходят к идее пайпа.
¶Конвейерная обработка данных
Идея пайпов легла в основу философии Unix — «делай одно дело и делай его хорошо» и «программы должны работать вместе». Конвейерная обработка стала одним из ключевых принципов проектирования утилит Unix. Этот принцип позднее был перенесён в другие системы: в Windows PowerShell, в конвейеры обработки данных в Apache Hadoop и Apache Spark (хотя там термин «пайп» используется в более широком смысле — как последовательность стадий обработки), в функциональное программирование (конвейеры функций).
¶Смежные понятия
С пайпами тесно связаны механизмы перенаправления ввода-вывода (>, <, >>), которые направляют потоки данных в файлы, а не между процессами. Комбинация перенаправления и пайпов позволяет строить сложные конвейеры обработки данных. Другой близкий механизм — сокеты, обеспечивающие двустороннюю передачу данных между процессами, в том числе по сети.
¶Источники
- McIlroy M. D. A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986
- Bach M. J. The Design of the UNIX Operating System, Prentice Hall
- Raymond E. S. The Art of UNIX Programming, Addison-Wesley
- Справочные страницы Linux: pipe(2), mkfifo(1), bash(1)
