Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
664 из 715
алгоритм sighandle /* алгоритм обработки сигналов */
входная информация: отсутствует
выходная информация: отсутствует
{
if (текущий процесс является чьим-то спутником или имеет прототипа) {
if (сигнал игнорируется) return;
if (сигнал поступил во время выполнения системной функции)
поставить сигнал перед процессом-спутником;
else послать сообщение о сигнале периферийному процессу;
}
else { /* периферийный процесс */
/* поступил ли сигнал во время выполнения системной функции или нет */
послать сигнал процессу-спутнику;
}
}
алгоритм satellite_end_of_syscall /* завершение системной функции, вызванной периферийным процессом */
входная информация: отсутствует
выходная информация: отсутствует
{
if (во время выполнения системной функции поступило прерывание)
послать периферийному процессу сообщение о прерывании, сигнал;
else /* выполнение системной функции не прерывалось */
послать ответ: включить флаг, показывающий поступление сигнала;
}
Рисунок 13.7. Обработка сигналов в периферийной системе
Допустим, что периферийный процесс приостановил свою работу на то время, пока процесс-спутник исполняет системную функцию от его имени. Если сигнал возникает в другом месте, процесс-спутник обнаруживает его раньше, чем периферийный процесс. Возможны три случая.
1. Если в ожидании некоторого события процесс-спутник не переходил в состояние приостанова, из которого он вышел бы по получении сигнала, он выполняет системную функцию до конца, посылает результаты выполнения периферийному процессу и показывает, какой из сигналов им был получен.
2. Если процесс сделал указание об игнорировании сигнала данного типа, спутник продолжает следовать алгоритму выполнения системной функции, не выходя из состояния приостанова по longjmp. В ответе, посылаемом периферийному процессу, сообщение о получении сигнала будет отсутствовать.
3.
|< Пред. 662 663 664 665 666 След. >|