Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 71 72 73 74 75 76 < 77 > 78 79 80 81 82 83 .. 124 >> Следующая

используемых для точноп настроики дескрипторов файлов См пункт open в
главе 3 книги Programming Perlmw на man странице perlfunc(l)
192
Изучаем Perl
полностью игнорируются. Почти для любого сигнала действие по умолчанию
может быть переопределено, с тем чтобы данный сигнал либо игнорировался,
либо перехватывался (с автоматическим вызовом указанной пользователем
части кода).
Все это аналогично тому, что делается и в других языках программирования,
но сейчас излагаемый материал приобретет специфический Рег1-от-тенок.
Когда Perl-процесс перехватывает сигнал, асинхронно и автоматически
вызывается указанная вами подпрограмма, моментально прерывая
выполнявшийся до нее код. Когда эта подпрограмма завершается, выполнение
прерванного кода возобновляется, как будто ничего не случилось (за
исключением появления результатов действий, выполненных этой
подпрограммой,- если она вообще что-нибудь делала).
Обычно подпрограмма-обработчик сигнала делает одно из двух: прерывает
программу, выполнив "очистку", или устанавливает какой-то флаг (например,
глобальную переменную), которую данная программа затем проверяет*.
Для того чтобы зарегистрировать подпрограммы-обработчики сигналов в Perl,
нужно знать имена сигналов. После регистрации обработчика сигнала Perl
при получении этого сигнала будет вызывать выбранную подпрограмму.
Имена сигналов определяются на man-странице signal(2), а также, как
правило, в подключаемом С-файле /usr/include/sys/signal.h. Эти имена
обычно начинаются с букв SIG, например sigint, sigquit и sigkill. Чтобы
объявить подпрограммуmy_sigint_catcher () обработчиком сигнала SIGINT,
мыдолж-ны установить соответствующее значение в специальном хеше %sig. В
этом хеше в качестве значения ключа int (это sigint без sig) следует
указать имя подпрограммы, которая будет перехватывать сигнал sigint:
$ SIG f'INT1> = 'my_sigint_catcher' ;
Но нам понадобится также определение этой подпрограммы. Вот пример
простого определения:
sub my_sigint__catcher {
$saw__sigint = 1; # установить флаг
}
Данный перехватчик сигналов устанавливает глобальную переменную и сразу
же возвращает управление. Выполнение программы продолжается с той
позиции, в которой оно было прервано. Обычно сначала обнуляется флаг
$saw_sigint, соответствующая подпрограмма определяется как перехватчик
сигнала sigint, а затем следует код основной программы, например:
$saw_sigint = 0; # очистить флаг
$SIG{'INT'} = 'my_sigint_catcher'; # зарегистрировать перехватчик
Попытка выполнения действий более сложных, чем вышеописанные, вероятнее
всего, запутает ситуацию; большинство внутренних механизмов Perl "не
любят", когда их вызывают одновременно в основной программе и из
подпрограммы. Ваши системные библиотеки тоже этого "не любят".
14. Управление процессалш
193
foreach (@huge_array) {
# что-нибудь сделать
# еще что-нибудь сделать
# и еще что-нибудь if ($saw_sigint) ( # прерывание нужно?
# здесь "очистка"
last;
}
}
$SIG{'INT'} = 'DEFAULT'; # восстановить действие по умолчанию
Особенность использования сигнала в данном фрагменте программы состоит
том, что значение флага проверяется в важнейших точках процесса
вычисления и используется для преждевременного выхода из цикла; при этом
выполняется и необходимая "очистка". Обратите внимание на последний
оператор в приведенном выше коде: установка действия в значение default
восстанавливает действие конкретного сигнала по умолчанию (следующий
сигнал sigint немедленно прервет выполнение программы). Еще одно полезное
специальное значение вроде этого - ignore, т.е. "игнорировать сигнал"
(если действие по умолчанию - не игнорировать сигнал, как у sigint). Для
сигнала можно установить действие ignore, если не нужно выполнять никакой
"очистки" и вы не хотите преждевременно завершать выполнение основной
программы.
Один из способов генерирования сигнала sigint - заставить пользователя
нажать на клавиатуре терминала соответствующие прерыванию клавиши
(например, [Ctrl+C]). Процесс тоже может генерировать сигнал sigint,
используя для этого функцию kill. Данная функция получает номер или имя
сигнала и посылает соответствующий сигнал в процессы (обозначенные
идентификаторами) согласно списку, указанному после сигнала.
Следовательно, для передачи сигнала из программы необходимо определить
идентификаторы процессов-получателей. (Идентификаторы процессов
возвращаются некоторыми функциями, например функцией fork, и при открытии
программы как дескриптора файла функцией open). Предположим, вы хотите
послать сигнал 2 (известный также как sigint) в процессы 234 и 237. Это
делается очень просто:
kill(2,234,237); # послать SIGINT в 234 и 237
kill ('INT', 234, 237); # то же самое
Более подробно вопросы обработки сигналов описаны в главе 6 книги
Programming Perl и на man-странице perlipc(l).
194
Изучаем Perl
Упражнения
Ответы к упражнениям см. в приложении А.
1. Напишите программу, которая получает результат команды date и
Предыдущая << 1 .. 71 72 73 74 75 76 < 77 > 78 79 80 81 82 83 .. 124 >> Следующая