Jump to content

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

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

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

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

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

$ diff <(sort file1) <(sort file2)

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

Без замены процесса альтернативами являются:

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

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

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

$ tee >(wc -l >&2) < bigfile | gzip > bigfile.gz

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

[ редактировать ]

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

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

Механизм

[ редактировать ]

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

$ diff file1 <(sort file2)

Шаги, которые выполняет оболочка:

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

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

Ограничения

[ редактировать ]

Созданные «файлы» недоступны для поиска , что означает, что процесс чтения или записи в файл не может выполнять произвольный доступ ; он должен прочитать или записать один раз от начала до конца. Программы, которые явно проверяют тип файла перед его открытием, могут отказаться работать с подстановкой процесса, поскольку «файл», полученный в результате подмены процесса, не является обычным файлом . Кроме того, до версии Bash 4.4 (выпущенной в сентябре 2016 г.) не было возможности получить код завершения команды замены процесса из оболочки, создавшей замену процесса. [4]

См. также

[ редактировать ]
  1. ^ Розенблатт, Билл; Роббинс, Арнольд (апрель 2002 г.). «Приложение А.2». Изучение Korn Shell (2-е изд.). О'Рейли и партнеры. 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. ^ «Замена процесса» . Вики Грега . 22 сентября 2016 г. Проверено 6 февраля 2021 г.

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

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d8a686ec6d7b8719460df8693cc79a04__1716225900
URL1:https://arc.ask3.ru/arc/aa/d8/04/d8a686ec6d7b8719460df8693cc79a04.html
Заголовок, (Title) документа по адресу, URL1:
Process substitution - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)