Процессы и IPC
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: доклад, контрольная работа 10
| Добавил(а) на сайт: Dubinovskij.
Предыдущая страница реферата | 1 2 3 4 5 | Следующая страница реферата
Фильтрация выходных данных
Сколько познаю Perl, все не перестаю удивляться. Столько приятных сюрпризов не встречал еще нигде. Сам язык настолько логичен (если можно так выразиться), что открывает все свои тайны внимательному программисту, причем без частого обращения к документации. Вот и давеча, возникла у меня необходимость отфильтровать выходные данные некой CGI-программы…
Погодите разминать пальцы. Сначала выпьем по кружке кофею, а я, в это время, обрисую ситуацию в целом. Что такое фильтр на выходные данные всем понятно? Ну, если кому не понятно, то опять же – представим. Программа что-то там выводит в STDOUT (стандартный поток вывода), а в это время какая-то другая программа тихо и незаметно ворует эти данные и делает с ними все что заблагорассудится. Реальный пример? Ну, самое первое, что пришло мне в голову – это замена всех URL на гиперссылки. Или в помощь рассеянному программисту, вечно забывающему о HTTP- заголовках, проверять наличие оных заголовков и добавлять их если нужно. На самом деле, все может быть гораздо сложнее. Например, вырезание ненормативной лексики (этакий невидимый цензор) из текста сообщения, отправляемого посредством WEB- интерфейса, перед тем, как оно будет передаваться на вход SENDMAIL. Ну и в таком духе.
В общем, первая наша цель, это каким-то образом подсунуть новый STDOUT, который мы можем прочитать, программе, вывод от которой мы будем фильтровать. Но тут возможны варианты. Например, может быть, мы хотим организовать вывод по типу транзакции: или программа выполняется до конца, и выводится все содержимое, или же, в случае ошибки нужно сбросить данные, а вывести, например, LOCATION на страницу обработки ошибок. То есть, все зависит от уровня контроля над фильтруемым выходным потоком. Что бы совсем стало понятно, о чем я здесь распинаюсь, давайте напишем простой примерчик, демонстрирующий "тупой" фильтр-нумератор строк.
#!/usr/bin/perl –w
# nfilter.pl
filter();
for ($i = 0; $i < 20; $i ++)
{ print "Output line $in"; }
sub filter
{
die "Cannot fork" unless defined($fpid = open(STDOUT,"|-"));
return if ($fpid != 0);
num = 0;
while () { print "$num:t$_"; $num ++; }
exit;
}
Не вздумайте запускать. Что, уже запустили? Тогда жмите Ctrl+C. За то, теперь навсегда запомните – нужно закрывать дескрипторы (желательно все :). В чем же дело? Почему программа зависла? Все порожденные процессы являются процессами единой задачи. Потоки ввода вывода автоматически закрываются, когда завершается последний процесс. Конструкция open(STDOUT, "|-") неявно вызывает fork. Вспомните документацию по файловым операциям:
open(HANDLE, "| $cmd"); # направить информацию на вход программы
Так вот, здесь аналогичная ситуация, только в качестве программы здесь создается дочерний процесс. А так как в качестве дескриптора мы указываем STDOUT, то в настоящем процессе он переопределяется. Как и в случае с fork, относительно данных – дублируется их состояние на момент перед вызовом fork. Таким образом, в дочерний процесс попадает нормальный не переопределенный STDOUT. Замечу, что open с указанными аргументами в качестве результата возвращает те же самые значения, что и fork. Далее, программа определяет в каком она потоке – если не в порожденном ($fpid != 0), тогда возвращается и эмулирует вывод строк. Сам фильтр читает STDIN пока не закончатся данные. А данные закончатся, когда поток ввода будет закрыт (для родительского процесcа, это поток вывода). Родительский процесc уже завершил свою работу, а система ждет когда завершится последний процесс, что бы закрыть потоки. И так далее, и так далее. Чувствуете, где собака зарыта? После того, как вывод строк завершен, необходимо закрыть поток вывода, что бы фильтр, принимающий выходные данные через поток ввода вышел из цикла
while () { print "$num:t$_"; $num ++; }
Вот так то, берем и правим
#!/usr/bin/perl –w
# nfilter.pl
filter();
for ($i = 0; $i < 20; $i ++)
Рекомендуем скачать другие рефераты по теме: шпоры бесплатно, налоги и налогообложение.
Категории:
Предыдущая страница реферата | 1 2 3 4 5 | Следующая страница реферата