где signum — номер сигнала, при получении которого будет выполнено действие, связанное с запуском пользовательской функции, function — адрес функции, oldfunction — возвращаемое функцией значение. Вместо адреса функции процесс может передавать вызываемой процедуре signal числа 1 и 0: если function = 1, процесс будет игнорировать все последующие поступления сигнала с номером signum (особый случай, связанный с игнорированием сигнала «гибель потомка», рассматривается в разделе 7.4), если = 0 (значение по умолчанию), процесс по получении сигнала в режиме ядра завершается. В пространстве процесса поддерживается массив полей для обработки сигналов, по одному полю на каждый определенный в системе сигнал. В поле, соответствующем сигналу с указанным номером, ядро сохраняет адрес пользовательской функции, вызываемой по получении сигнала процессом. Способ обработки сигналов одного типа не влияет на обработку сигналов других типов.
алгоритм psig /* обработка сигналов после проверки их существования */
входная информация: отсутствует
выходная информация: отсутствует
{
выбрать номер сигнала из записи таблицы процессов;
очистить поле с номером сигнала;
if (пользователь ранее вызывал функцию signal, с помощью которой сделал указание игнорировать сигнал данного типа)
return;
if (пользователь указал функцию, которую нужно выполнить по получении сигнала)
{
из пространства процесса выбрать пользовательский виртуальный адрес функции обработки сигнала;
/* следующий оператор имеет нежелательные побочные эффекты */
очистить поле в пространстве процесса, содержащее адрес функции обработки сигнала;
внести изменения в пользовательский контекст:
искусственно создать в стеке задачи запись, имитирующую обращение к функции обработки сигнала;
внести изменения в системный контекст:
записать адрес функции обработки сигнала в поле счетчика команд, принадлежащее сохраненному регистровому контексту задачи;
return;
}
if (сигнал требует дампирования образа процесса в памяти)
{
создать в текущем каталоге файл с именем «core»;
переписать в файл «core» содержимое пользовательского контекста;
}
немедленно запустить алгоритм exit;
}
Рисунок 7.8. Алгоритм обработки сигналов