Анонимные каналы: механизмы межпроцессного взаимодействия
Anonymous pipe
Анонимные каналы (pipes) в Linux/Unix: однонаправленная связь между процессами. Реализация в ОС, создание pipelines, двунаправленная связь – два канала.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
В информатике анонимный канал (pipe) — это однонаправленный канал связи FIFO, который может использоваться для односторонней межпроцессной коммуникации (IPC). Реализация часто интегрируется в подсистему файлового ввода-вывода операционной системы. Обычно родительская программа открывает анонимные каналы и создает новый процесс, который наследует другие концы каналов, или создает несколько новых процессов и организует их в конвейер. Для двусторонней (full duplex) связи обычно требуется два анонимных канала. Конвейеры поддерживаются в большинстве популярных операционных систем, начиная с Unix и DOS, и создаются с использованием символа "|" во многих оболочках.
In computer science, an anonymous pipe is a simplex FIFO communication channel that may be used for one way interprocess communication (IPC). An implementation is often integrated into the operating system's file IO subsystem. Typically a parent program opens anonymous pipes, and creates a new process that inherits the other ends of the pipes, or creates several new processes and arranges them in a pipeline. Full duplex (two way) communication normally requires two anonymous pipes. Pipelines are supported in most popular operating systems, from Unix and DOS onwards, and are created using the "|" character in many shells.
Unix
Трубопроводы — важная часть многих традиционных Unix-приложений, и их поддержка хорошо интегрирована в большинство Unix-подобных операционных систем. Трубопроводы создаются с помощью системного вызова `pipe`, который создает новый трубопровод и возвращает пару файловых дескрипторов, ссылающихся на читающий и записывающий концы трубопровода. Многие традиционные Unix-программы разработаны как фильтры для работы с трубопроводами.
Pipelines are an important part of many traditional Unix applications and support for them is well integrated into most Unix like operating systems. Pipes are created using the pipe system call, which creates a new pipe and returns a pair of file descriptors referring to the read and write ends of the pipe. Many traditional Unix programs are designed as filters to work with pipes.
Microsoft Windows
Как и многие другие средства ввода-вывода и межпроцессного взаимодействия в Windows API, анонимные каналы создаются и настраиваются с помощью API-функций, специфичных для данной подсистемы ввода-вывода. В данном случае CreatePipe используется для создания анонимного канала с отдельными дескрипторами для концов чтения и записи. Операции чтения и записи в канале выполняются с помощью стандартных API-функций ReadFile и WriteFile. В Microsoft Windows операции чтения и записи в анонимные каналы всегда блокирующие. Иными словами, чтение из пустого канала приведет к ожиданию вызывающего потока до тех пор, пока не станет доступен хотя бы один байт или не будет получен сигнал о конце файла в результате закрытия дескриптора записи канала. Аналогично, запись в заполненный канал приведет к ожиданию вызывающего потока до тех пор, пока не появится место для сохранения записываемых данных. Операции чтения могут возвращать меньше запрошенного количества байтов (также называемое частичным чтением). Новые процессы могут наследовать дескрипторы анонимных каналов в процессе создания.
Like many other device IO and IPC facilities in the Windows API, anonymous pipes are created and configured with API functions that are specific to the IO facility. In this case CreatePipe is used to create an anonymous pipe with separate handles for the read and write ends of the pipe. Read and write IO operations on the pipe are performed with the standard IO facility API functions ReadFile and WriteFile. On Microsoft Windows, reads and writes to anonymous pipes are always blocking. In other words, a read from an empty pipe will cause the calling thread to wait until at least one byte becomes available or an end of file is received as a result of the write handle of the pipe being closed. Likewise, a write to a full pipe will cause the calling thread to wait until space becomes available to store the data being written. Reads may return with fewer than the number of bytes requested (also called a short read). New processes can inherit handles to anonymous pipes in the creation process.