Linux Kernel (Ядро линукса) (часть 2)


Операции над сигнальными структурами

Для обработки сигналов ядро применяет несколько функций и макросов. В приведенном далее описании set является указателем на переменную
sigset t, nsig — НОМер сигнала, a mask — маска, имеющая ТИП unsigned long.
- sigemptyset (set) И sigfillset (set) — соответственно, сбрасывают И устанавливают биты в переменной sigset t;
- sigaddset (set, nsig) И sigdelset (set, nsig) — сбрасывают И устанавливают бит в переменной sigset t, соответствующий сигналу nsig. На практике sigaddset () СВОДИТСЯ К оператору
set->sig[(nsig — 1) / 32] |= 1UL « ((nsig — 1) 32); a sigdelset () — К оператору
set->sig[(nsig — 1) / 32] &= ~(1UL « ((nsig — 1) 32));
- sigaddsetmask (set,mask) И sigdelsetmask (set,mask) — устанавливает все биты переменной sigset t, для которых соответствующие биты маски mask равны 1 или 0 соответственно. Эти функции можно использовать только с сигналами, номера которых лежат между 1 и 32.
Функции сводятся к операторам
set->sig[0] |= mask;
И
set->sig[0] &= -mask;
- sigismember (set,nsig) — возвращает значение бита переменной sigset_t, соответствующего сигналу nsig. На практике эта функция сводится к оператору
return 1 & (set->sig[(nsig-1) / 32] » ( (nsig-1) 32));
- sigmask (nsig) — возвращает индекс бита сигнала nsig. Иными словами, если ядру понадобится сбросить, установить или проверить бит элемента sigset t, соответствующий данному сигналу, оно может вычислить нужный бит с помощью этого макроса;
sigandsets(d,si,s2), sigorsets(d,si,s2) И signandsets(d,si,s2) —
выполняют логическую операцию И, ИЛИ или НЕ-И, соответственно над переменными sigset t, некоторые указывают параметры si и s2. Результат сохраняется в переменной sigset t, на которую указывает параметр d;
- sigtestsetmask(set,mask) — возвращает 1, если установлен хотя бы один из битов переменной sigset t, соответствующий битам, установленным в маске mask; в противном случае возвращает 0. Эту функцию можно использовать только с сигналами, номера которых лежат между 1 и 32;
- siginitset (set,mask) — инициализирует биты переменной sigset t, соответствующие сигналам от 1 до 32, битами из маски mask и сбрасывает биты, соответствующие сигналам от 33 до 63;
- siginitsetinv(set,mask) — инициализирует биты переменной sigset t, соответствующие сигналам от 1 до 32, битами, комплементарными битам маски mask, и устанавливает биты, соответствующие сигналам от 33 до 63;
- signai pending(p) — возвращает 1 (истина), если процесс, идентифицируемый дескриптором р, имеет незаблокированные висящие сигналы, и 0 (ложь) в противном случае. Функция реализована в виде простой проверки флага tif sigpending этого процесса;
- recalc_sigpending_tsk (t) И recalc_sigpending
—первая функция Проверяет, имеются ли висящие сигналы либо для процесса, идентифицируемого дескриптором t (с этой целью она анализирует поле t->pending-> signal), либо для всей группы, в которую входит процесс (с этой целью анализируется поле t->signai->shared_pending->signai). Затем функция должным образом устанавливает флаг tif sigpending в поле t->thread_ info->fiags. Функция recaic sigpendingo эквивалентна вызову функции recalc_sigpending_tsk (current);
- rm from queue (mask, q) — удаляет ИЗ ОЧереДИ ВИСЯЩИХ Сигналов q ВИСЯЩИе сигналы, определяемые битовой маской mask;
- fiush sigqueue (q)— удаляет из очереди висящих сигналов q все висящие сигналы;
- fiush sigqueue(q) — удаляет все сигналы, посланные процессу, идентифицируемому дескриптором t. Это достигается путем сброса флага
TIF SIGPENDING В ПОЛе t->thread_info->f lags И Двухкратного ВЫЗОВа фуНК- ЦИИ flush_sigqueue )ДЛЯ очередей t->pending И t->signal->shared_ pending.

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...