П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3497 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6100 раз(а).

Учебник HTML.
Просмотров 3263 раз(а).

Руководство по PHP5.
Просмотров 5483 раз(а).

Хостинг через призму DNS.
Просмотров 4120 раз(а).

Подборка текстов стандартных документов.
Просмотров 55763 раз(а).

Учебник PHP - Самоучитель
Просмотров 3077 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 5397 раз(а).

Внешние атаки...
Просмотров 3821 раз(а).

Учебник PHP.
Просмотров 2817 раз(а).

SSI в примерах.
Просмотров 37452 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Глава 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");

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru