Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Службы ядра Доставка сигнала

Доставка сигнала

Большинство действий, связанных с доставкой сигнала потоку, выполняется в контексте этого потока. Поток проверяет свое поле 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 для восстановления состояния сигнала потока в то состояние, которое существовало до сигнала.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 69 гостей онлайн

Реклама на сайте:

Покупай идеальный пылесос м. Митино http://www.tehnosila.ru/catalog/bt/pylesosy/electrolux/.