Глава 14: Управление процессами.
14.3 Использование процессов как дескрипторов файлов
Следующий способ запуска процесса — создание процесса, который выглядит как дескриптор файла (аналогично библиотечной подпрограмме рореn(3), если ви с ней знакомы). Мы можем создать для процесса дескриптор файла, который либо получает результат работы процесса, либо подает в него входные данные**. Ниже приведен пример создания дескриптора файла для процесса who(l). Поскольку этот процесс вьщает результат, который мы хотим прочитать, мы создаем дескриптор файла, открытый для чтения:
open(WHOPROC, "who 1"); # открнть who для чтения
Обратите внимание на вертикальную черту справа от who. эта черта информирует Perl о том, что данная операция open относится не к имени файла, а к командо, которую необходимо запустить. Поскольку черта стоит справа от команды, данннй дескриптор файла открнвается для чтения. Это означает, что предполагается прием данных со стандартного вывода команды who. (Стандартный ввод и стандартный вывод ошибок продолжают использоваться совместно с Perl-процессом.) Для остальной части программы дескриптор whoproc — это просто дескриптор файла, который открыт для чтения, что означает возможность выполнения над файлом всех обычных операций ввода-вывода. Вот как можно прочитать данные из команды who в массив:
@whosaid = <WHOPROC>;
** Ho не одновременно. Примеры двунаправленной связи приведены в главе 6 книги Programming Perl и на man-странице реrlірс(1).
Аналогичным образом для запуска команды, которой необходимы входные данные, мы можем открыть дескриптор файла процесса для записи, поставив вертикальную черту слева от команды, например:
open(LPR,"|Ipr -Psiatewriter");
print LPR Srockreport;
close(LPR);
В этом случае после открытия lpr мы записываем в него данные и закриваем данный файл. Открытие процесса с дескриптором файла позволяет выполнять команду параллельно с Perl-программой. Задание для дескриптора файла команды close заставляет Perl-программу ожидать завершения процесса. Если дескриптор не будет закрыт, процесс может продолжаться даже после завершения Perl-программы.
Открытие процесса для записи предполагает, что стандартный ввод команды будет получен из дескриптора файла. Стандартный вывод и стандартный вывод ошибок используются этим процессом совместно с Perl. Как и прежде, ви можете использовать переадресацию ввода-вывода в етиле /bin/sh. Вот как в нашем последнем примере можно отбрасывать сообщения об ошибках команды Ipr.
open(LPR,"|Ipr -Psiatewriter >/dev/null 2>&1");
С помощью операций >/dev/null обеспечивается отбрасывание стандартного вывода путем переадресации его на нулевое устройство. Операция 2>&1 обеспечивает передачу стандартного вывода ошибок туда, куда направляется стандартный вывод, поэтому сообщения об ошибках также отбрасываются.
Можно даже обьединить все эти фрагменти программы и в результате получить отчет обо всех зарегистрированных пользователях, кроме Фреда:
open (WHO,"who[ ");
open (LPR,"|Ipr - Psiatewriter");
while (<WHO>) {
unless (/fred/) { # не показывать имя Фред
print LPR $_;
}
}
close WHO;
close LPR;
Считивая из дескриптора who по одной строке, этот фрагмент кода выводит в дескриптор lpr все строки, которне не содержат строкового значения fred. В результате на принтер выводятся только те строки, которне не содержат имени fred.
Вовсе не обязательно указывать в команде open только по одной команде за один прием. В ней можно задать сразу весь конвейер. Например, следующая строка запускает процесс ls(l), который передает свои результаты по каналу в процесс tail(l), который, в свою очередь, передает свои результаты в дескриптор файла whopr:
open(WHOPR, "Is I tail -r I");
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|