Функция exec

Практически все, что было сказано о синтаксисе и семантике system, также относится к функции exec – кроме одного (очень важного) обстоятельства. Функция system создает дочерний процесс, который берется за свою работу, пока Perl терпеливо ждет. Функция exec заставляет сам процесс Perl выполнить запрашиваемое действие. Происходящее больше напоминает переход goto, нежели вызов функции. Предположим, мы хотим выполнить команду bedrock из каталога /tmp. Команда вызывается с аргументами –o args1, а за ними должны следовать аргументы, с которыми была запущена наша программа. Это будет выглядеть примерно так:

chdir "/tmp" or die "Cannot chdir /tmp: $!";
exec "bedrock", "o", "args1", @ARGV;

При достижении операции exec Perl находит команду bedrock и «передает ей управление». После передачи процесс Perl исчезает1, а остается процесс, в котором выполняется команда bedrock. С завершением bedrock процесса Perl, которому можно было бы вернуть управление, не остается, и мы возвращаемся к приглашению командной строки (так, словно программа была запущена из командной строки). Зачем это нужно? Скажем, если единственной целью программы Perl является подготовка среды исполнения для другой программы.


Как только эта цель будет выполнена, запускается другая программа. Если бы мы использовали system вместо exec, программе Perl пришлось бы терпеливо дожидаться завершения system – только для того, чтобы немедленно завершиться после возврата управления, а это весьма неэффективно.

При этом exec на практике используется относительно редко, разве что в сочетании с fork (см. далее). Если вы ломаете голову над выбором «system или exec», выбирайте system, и вы почти всегда окажетесь правы. Так как Perl перестает управлять выполнением программы после запуска указанной команды, любой код Perl после вызова exec не имеет смысла, кроме обработки ошибок в том случае, если запрос на запуск команды завершился неудачей:

exec "date";
die "date couldn't run: $!";

Более того, если включен режим предупреждений, а за exec следует любой другой код вместо die2, Perl оповестит вас об этом.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Ветвление
Выполнение команд в обход командного процессора
Обратные апострофы в списочном контексте
Обратные апострофы и сохранение вывода
Отправка и прием сигналов

Вернуться в раздел: Perl / 15. Управление процессами