Генерирование сигнала
Сигналы генерируются многими функциями ядра. Первую фазу обработки сигнала (описанную в разд. ”Роль сигналов”ранее в этой главе) эти функции выполняют, обновляя один или несколько дескрипторов процессов по мере необходимости. Они не выполняют непосредственно вторую фазу, доставку сигнала, но, в зависимости от типа сигнала и состояния процессов- получателей, могут "разбудить" некоторые процессы и заставить их принять сигнал.
Когда сигнал отправляется процессу либо ядром, либо другим процессом, ядро генерирует его с помощью одной из функций,
заканчиваются вызовом функции specific send sig info , описанной в следующем разделе.
Когда сигнал посылается всей группе потоков либо ядром, либо другим процессом, ядро генерирует его с помощью одной из функций
заканчиваются вызовом функции group_send_ sig_info, описанной в разд. "Функция group send sig infoO" далее в этой главе.
Функция specific_send_sig_info
Функция specific send sig infoo посылает сигнал конкретному процессу. Она принимает три параметра:
-sig — номер сигнала;
- info— либо адрес таблицы siginfo t, либо одно из трех специальных значений: 0 — сигнал был послан процессом режима пользователя, 1 — сигнал был послан ядром, 2 — сигнал был послан ядром, и это sigstop или sigkill;
- t — указатель на дескриптор процесса-получателя.
Функция specific send sig info ДОЛЖНа быть ВЫЗВана С ОТКЛЮЧеННЫМИ локальными прерываниями и с уже полученной спин-блокировкой t-> sighand->sigiock. Она выполняет следующие действия:
1. Проверяет, игнорируется ли сигнал процессом. Если это так, возвращает 0 (сигнал не сгенерирован). Сигнал игнорируется, когда удовлетворены все три условия:
• процесс не отслеживается (флаг pt ptraced в поле t->ptrace сброшен);
• сигнал не заблокирован (функция sigismember(&t->blocked, sig) ВОЗ- вращает 0);
• сигнал игнорируется либо ЯВНО (поле sa_handler структуры t->sighand-> action[sig-i] равно sig ign), либо косвенно (поле sa handler равно SIG_DFL, И послан СИГНаЛ SIGCONT, SIGCHLD, SIGWINCH ИЛИ SIGURG).
2. Проверяет, что сигнал не является сигналом реального времени (sigpending. signal, sig) возвращает 1). Если это действительно так, ничего делать не нужно, и функция возвращает 0.
3. Вызывает функцию send signal (sig, info, t, &t->pending), чтобы добавить сигнал в очередь висящих сигналов процесса. Эта функция подробно описана в следующем разделе.
4. Если функция send signal о завершилась успешно, и сигнал не заблокирован (функция sigismember (&t->blocked, sig) ВОЗВращает 0), ОПИСЫВаемая функция вызывает функцию signal_wake_up, чтобы уведомить процесс
о новом висящем сигнале. Вызванная функция выполняет следующие действия:
• устанавливает флаги tif_sigpending в поле t->thread_info->fiags;
• вызывает функцию try_to_wake_up , чтобы возобновить выполнение процесса, если он находится в состоянии task_ interrupt ible, либо в состоянии task_stopped, причем послан сигнал
sigkill;
• если функция try_to_wake_up возвратила 0, значит, процесс уже был "разбужен". В таком случае функция signal wake upO проверяет, выполняется ли процесс на другом процессоре, и, если это так, посылает тому процессору межпроцессорное прерывание, чтобы произошла перепланировка выполнения текущего процесса Поскольку каждый процесс проверяет наличие висящих сигналов после возврата управления от функции schedule о, межпроцессорное прерывание является гарантией того, что процесс-получатель заметит новый висящий сигнал.
5. Возвращает 1 (сигнал успешно сгенерирован).
Предыдущая страница | 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 | Следующая страница