Ветвление

Кроме высокоуровневых интерфейсов, описанных ранее, Perl предоставляет практически прямой доступ к низкоуровневым системным функциям UNIX и других систем. Если ранее вы никогда не имели дела с этой областью1, вероятно, этот раздел можно пропустить. Привести подробное описание в этой главе не удастся, но, по крайней мере, разберем в общих чертах реализацию следующего вызова:

system "date";
При использовании низкоуровневых системных вызовов эта задача
реализуется так:
defined(my $pid = fork) or die "Cannot fork: $!";
unless ($pid) {
# Дочерний процесс
exec "date";
die "cannot exec date: $!";
}
# Родительский процесс
waitpid($pid, 0);

Мы проверяем возвращаемое значение fork, которое будет равно undef в случае сбоя. Обычно вызов завершается удачно, а к следующей строке переходят уже два разных процесса, но только родительский процесс содержит ненулевое значение в $pid, поэтому только дочерний процесс выполнит функцию exec. Родительский процесс пропускает этот вызов и выполняет функцию waitpid, ожидающую завершения этого конкретного дочернего процесса. Если это описание покажется полной абракадаброй, просто запомните, что вы можете пользоваться функцией system, и над вами никто не будет смеяться.


За все дополнительные хлопоты вы получаете полный контроль за созданием каналов, переназначением файловых дескрипторов и информацию об идентификаторах процесса и его родителя (если он известен). Но как уже говорилось ранее, тема ветвления немного сложна для этой главы. За дополнительной информацией обращайтесь к manстранице perlipc (или любой хорошей книге по прикладному программированию для вашей системы).

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

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

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