Замена процесса - Process substitution

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

История

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

Пример

В следующих примерах используется синтаксис KornShell.

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

$ diff <(сортировать файл1) <(сортировать файл2)

В <(команда) выражение указывает интерпретатору команд запустить команда и сделать его вывод в виде файла. В команда может быть любой произвольно сложной командой оболочки.

Альтернативы без замены процесса:

  1. Сохраните вывод команды (ов) во временный файл, затем прочтите временный файл (ы).
    $ сортировать файл2> /tmp/file2.sorted$ сортировать файл1 | diff - /tmp/file2.sorted$ rm /tmp/file2.sorted
  2. Создать именованный канал (также известный как ФИФО ), начните запись одной команды в именованный канал в фоновом режиме, затем запустите другую команду с указанным каналом в качестве входных данных.
    $ mkfifo /tmp/sort2.fifo$ сортировать файл2> /tmp/sort2.fifo &$ сортировать файл1 | diff - /tmp/sort2.fifo$ rm /tmp/sort2.fifo

Обе альтернативы более громоздки.

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

$ тройник>(туалет -l>&2) <большой файл | gzip> bigfile.gz

Преимущества

Основные преимущества замены процесса перед его альтернативами:

  • Простота: Команды можно вводить в строке; нет необходимости сначала сохранять временные файлы или создавать именованные каналы.
  • Спектакль: Чтение напрямую из другого процесса часто происходит быстрее, чем необходимость записывать временный файл на диск, а затем читать его обратно. Это также экономит место на диске.
  • Параллелизм: Замещенный процесс может выполняться одновременно с командой, считывающей ее вывод или записывающей ее ввод, используя преимущества многопроцессорность чтобы сократить общее время вычислений.

Механизм

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

$ diff file1 <(сортировать файл2)

Эта оболочка выполняет следующие шаги:

  1. Создайте новый анонимный канал. Эта труба будет доступна с чем-то вроде / dev / fd / 63; вы можете увидеть это с помощью такой команды, как эхо <(истина).
  2. Выполнить замененную команду в фоновом режиме (сортировать файл2 в данном случае), передавая свой вывод в анонимный канал.
  3. Выполните основную команду, заменив подставляемую команду на путь анонимного канала. В этом случае полная команда может быть расширена до чего-то вроде diff file1 / dev / fd / 63.
  4. По завершении выполнения закройте анонимный канал.

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

Ограничения

Замена процесса имеет некоторые ограничения:

  • Нет поиска файлов: созданные "файлы" не доступный, что означает, что процесс чтения или записи в файл не может выполняться произвольный доступ; он должен читать или писать один раз от начала до конца. Программы, которые явно проверяют тип файла перед его открытием, могут отказаться работать с подстановкой процесса, потому что "файл", полученный в результате подстановки процесса, не является обычный файл.
  • Нет кодов выхода: «Невозможно получить код выхода команды подстановки процесса из оболочки, создавшей подстановку процесса». [4]

Смотрите также

Рекомендации

  1. ^ Розенблатт, Билл; Роббинс, Арнольд (апрель 2002 г.). «Приложение А.2». Изучение оболочки Korn (2-е изд.). O'Reilly & Associates. ISBN  0-596-00195-9.
  2. ^ Дафф, Том (1990). Rc - оболочка для Plan 9 и систем UNIX. CiteSeerX  10.1.1.41.3287.
  3. ^ Рэми, Чет (18 августа 1994 г.). Примечания к выпуску Bash 1.14. Фонд свободного программного обеспечения. Доступно вИсходный архив GNU версии 1.14.7 по состоянию на 12 февраля 2016 г.
  4. ^ «Процесс Замещение». Вики Грега. 27 июня 2011 г.

дальнейшее чтение