Большинство действий, связанных с доставкой сигнала потоку, выполняется в контексте этого потока. Поток проверяет свое поле td_siglist на предмет наличия ожидающих сигналов по крайней мере один раз при входе в систему, вызывая cursig().
Если cursig() обнаруживает, что в списке сигналов потока имеются какие-либо незамаскированные сигналы, она вызывает issignal(), чтобы найти первый немаскированный сигнал в списке. Если доставка сигнала должна вызвать обработчик сигнала или создать дамп ядра, вызывающий уведомляется о наличии ожидающего сигнала, а доставка осуществляется посредством вызова posting(), т. е.:
If(sig = cursig(curthread)) postsig(sig);
В противном случае действие, связанное с сигналом, осуществляется внутри issignal() (эти действия имитируют действия, выполняемые psignal()). Процедура postsig() обрабатывает два случая.
Создание дампа ядра. Вызов обработчика сигнала.Первая задача осуществляется процедурой coredump(), и за ней всегда следует вызов exit() для форсирования завершения процесса. Для вызова обработчика сигнала postsig() сначала вычисляет набор замаскированных сигналов и устанавливает этот набор в tdsigmask. Этот набор обычно включает сигналы в процессе доставки, так что обработчик сигнала не будет рекурсивно вызван одним и тем же сигналом. Также будут включены все сигналы, указанные в системном вызове sigaction в момент установки обработчика. Процедура postsig() вызывает затем процедуру sendsig() для организации немедленного выполнения обработчика сигнала после возвращения потока в режим пользователя. Наконец, сигнал в td_siglist очищается и postsig() возвращается в предположении, что за ним последует возврат в режим пользователя.

Реализация процедуры sendsig() машинно-зависимая. На рисунке показан поток управления, связанный с доставкой сигнала. Если был запрошен альтернативный стек, указатель стека пользователя переключается на этот стек. Список аргументов в текущем контексте выполнения потока режима пользователя сохраняется ядром в (возможно новом) стеке. Состояние потока управляется таким образом, что по возвращении в режим пользователя будет немедленно сделан вызов в тело кода, который обозначается как код трамплина сигнала (signal-trampoline code). Этот код вызывает обработчик сигнала с соответствующим списком аргументов и, если обработчик возвращается, осуществляет системный вызов sigreturn для восстановления состояния сигнала потока в то состояние, которое существовало до сигнала.
- 22/10/2010 11:30 - Семантика тюрьмы
- 19/10/2010 04:06 - Тюрьмы
- 17/10/2010 19:25 - Управление заданиями
- 17/10/2010 12:22 - Сеансы
- 14/10/2010 16:15 - Группы процессов и сеансы
- 10/10/2010 22:11 - История сигналов
- 10/10/2010 01:09 - Процедуры вычисления приоритета потока
- 09/10/2010 12:36 - Сигналы
- 09/10/2010 10:28 - Завершение процесса
- 06/10/2010 04:14 - Вычисления приоритета потоков