Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 [ 190 ] 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

16.14. Посылка сигнала 587

use Config

defined $Config{sig name} or die No sigs ,

$1=0, # Config добавляет ложный сигнал О

# с именем ZERO foreach $name (split( , $Config{sig name})) {

$signo{$name} = $i,

$signame[$i] - Sname,

$1++,

I> Смотри также-

Документация по стандартному модулю Config; раздел «Signals» perlipc(i).

16.14. Посылка сигнала

Проблема

Требуется послать сигнал процессу. Возможна посылка сигнала как вашему собственному процессу, так и другому процессу в той же системе. Например, вы перехватили SIGINT и хотите передать его потомкам.

Решение

Функция kill отправляет сигнал с заданным именем или номером процессам, идентификаторы которых перечисляются в качестве остальных аргументов:

kill 9 => Spid, # Послать Spid сигнал 9

kill -1 => Spgrp, # Послать всему заданию сигнал 1

kill USR1 => $$, # Послать себе SIGUSR1

kill HUP => (apids, # Послать SIGHUP процессам из gpids

Комментарий

Функция Perl kill обеспечивает интерфейс к системной функции с тем же именем. Первый аргумент определяет посылаемый сигнал и задается по номеру или по имени; остальные аргументы определяют идентификаторы процессов, которым отправляется сигнал. Функция возвращает количество процессов, успешно получивших сигнал. Сигналы можно отправлять только процессам, для которых реальный или сохраненный идентификатор пользователя совпадает с вашим реальным или текущим идентификатором - если только вы не являетесь привилегированным пользователем.

Если номер сигнала отрицателен, Perl интерпретирует остальные аргументы как идентификаторы групп процессов и отправляет сигнал процессам, входящим в эти группы, с помощью системной функции killpg(2).

Группа процессов фактически представляет собой задание. Именно так операционная система объединяет родственные процессы. Например, когда вы с помощью командного интерпретатора сцепляете две команды, при этом запускаются два процесса, но лишь одно задание. Когда текущее задание прерывается по Ctrl-i-C



или приостанавливается по Ctrl+Z, соответствующие сигналы отправляются всему заданию, которое может состоять из нескольких процессов.

Функция kill также позволяет проверить, жив ли процесс. Посылка специального псевдосигпала с номером О сообщает, можно ли послать сигнал процессу - хотя сам сигнал при этом не передается. Если функция возвращает true, процесс жпв. Еслн возвращается false, процесс либо сменил свой действующий идентификатор (в этом случае неременной $ присваивается EPERM), либо прекратил существование ($ присваивается ESRCH), Для процессов-зомби (см. рецепт 16.19) также возвращается ESRCH.

use POSIX qw( errno h)

if (kill 0 => Sminion) {

print Sminion is alive\n , } elsif ($1 == EPERM) { # Изменился UID

print Sminion has escaped my control\n , } elsif ($ == ESRCH) {

print Sminion IS deceased \n , t* Или зомби } else !

warn Odd, 1 couldn t check on the status of Sminion $\n

I> Смотри также-

Раздел «Signals» perUpc{\); страницы руководства sigaciion(2), iignal(3) и kdl(2) вашей системы (если есть); оннсанне функции kill в perljunc(l).

16.15. Установка обработчика сигнала

проблема

Вы хотите управлять реакцией программы на сигналы. Это может понадобиться для перехвата Ctrl+C, избежания накопления завершившихся подпроцессов или предотвращения гибели вашего процесса при попытке передать данные исчезнувшему потомку.

Решение

Воспользуйтесь хэшем %SIG для установки обработчика по имени или ссылке на код:

$S1G{QUIT} = \&got sig quit, # Вызвать &got sig quit

# для каждого S1GQU1T SSIGfPIPE} = got sig pipe , # Вызвать main got sig pipe

t* для каждого SIGPIPE SSIG{INT} = sub { $ouch++ } # Увеличить $ouch для каждого SIGINT

Хэш %SIG также позволяет игнорировать сигнал;

SSIGflNT} = IGNORE , # Игнорировать сигнал INT

Также есть возможность восстановить стандартный обработчик сигнала;



$SIG{STOP} = DEFAULT # Восстановить стандартный обработчик

# сигнала STOP

Комментарий

Хэш %SIG используется в Perl для управления тем, что происходит при получении сигналов. Каждый ключ %SIG соответствует оиределенному сигналу, а значение - действию, которое должно иредприниматься при его иолучении. В Perl предусмотрены два особых ассоциированных значения: IGNORE означает, что при иолучении сигнала ие следует выполнять никаких действий, а DEFAULT выполняет стандартные действия UNIX для дан1Юго сигнала.

Хотя программисты на С привыкли к термину SIGINT, в Perl используется только INT. Предполагается, что имена сигналов используются только в фуш<ци-ях, связанных с обработкой! сигналов, поэтому префикс SIG оказывается лишним. Следовательно, чтобы изменить действия вашего процесса при получении сигнала SIGCHLD, следует присвоить значение $SIG{CHLD}.

Чтобы ваш код выполнялся при получещти конкретного сигнала, в хэш заносится либо ссылка иа код, либо имя функции (следовательно, при сохранении строки вам не удастся использовать обработчик с именем IGNORE или DEFAULT; впрочем, для обработчика сигнала эти имена выглядят довольно странно) Если имя функции не содержит информации о пакете, Perl считает, что фу1и<ция принадлежит пакету main , а не то.му пакету, в котором обработчик был установлен. Ссылка на код относится к конкретному пакету, и этот вариант считается предпочтительным.

Perl передает коду обработчика одни аргумент: имя сигнала, по которому он вызывается (например, INT или USR1 ). При выходе из обработчика продолжается выполнение действий, выполнявшихся в момент поступления сигнала

Perl определяет два специальных сигнала, DIE и WARN . Обработчики этих сигналов вызываются каждьи"! раз, когда программа на Perl выводит предупреждение (warn) или умирает (die). Это позволяет нам перехватывать предупреждения и по своему усмотрению обрабатывать их или передавать дальше. На вре.мя своего выполнения обработчики die и warn отключаются, поэтому вы можете спокойно вызвать die в обработчике DIE или warn в обработчике WARN , не опасаясь рекурсии.

> Смотри также-

Раздел «Signals» perlipc(l); страницы руководства sigaction{2), signal{3) и М/(2) вашей системы (если есть).

16.16. Временное переопределение обработчика сигнала

Проблема

Вы хотите установить обработчик сигнала, действующий только на время выполнения конкретной подпрограммы. Например, ваша подпрограмма перехватывает



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 [ 190 ] 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242