Замена процесса


В вычислениях подстановка процессов — это форма межпроцессного взаимодействия , которая позволяет вводу или выводу команды отображаться в виде файла. Команда заменяется в строке, где обычно встречается имя файла, командной оболочкой . Это позволяет программам, которые обычно принимают только файлы, напрямую читать или записывать в другую программу.

Подстановка процесса была доступна как опция времени компиляции для ksh88версии KornShell 1988 года от Bell Labs . [1] Оболочка rc предоставляет функцию «конвейерного ветвления» в версии 10 Unix , выпущенной в 1990 году. [2] Оболочка Bash обеспечивала подстановку процессов не позднее версии 1.14, выпущенной в 1994 году. [3]

Команда Unix diff обычно принимает имена двух файлов для сравнения или одно имя файла и стандартный ввод. Подстановка процесса позволяет напрямую сравнивать вывод двух программ:

Подстановку процесса также можно использовать для захвата выходных данных, которые обычно направляются в файл, и перенаправления их на входные данные процесса. Синтаксис Bash для записи в процесс — >(command). Вот пример использования команд tee, wcи gzip, которые подсчитывают строки в файле wc -lи сжимают его gzipза один проход:

Под капотом процесс замены имеет две реализации. В системах, которые поддерживают /dev/fd(большинство Unix-подобных систем), он работает, вызывая pipe()системный вызов, который возвращает дескриптор файла $fdдля нового анонимного канала, затем создает строку /dev/fd/$fdи заменяет ее в командной строке. В системах без /dev/fdподдержки он вызывает mkfifoновое временное имя файла для создания именованного канала и заменяет это имя файла в командной строке. Чтобы проиллюстрировать необходимые шаги, рассмотрим следующую простую подстановку команд в системе с /dev/fdподдержкой:

Для именованных каналов выполнение отличается только созданием и удалением канала; они создаются с помощью mkfifo(которому дается новое имя временного файла) и удаляются с помощью unlink. Все остальные аспекты остаются прежними.