Структуры данных, ассоциированные с сигналами
Для каждого процесса в системе ядро должно отслеживать, какие сигналы в данный момент висят или замаскированы. Ядро также должно отслеживать, как каждая группа потоков будет обрабатывать сигналы. Для этих целей ядро использует несколько структур, доступных через дескриптор процесса.
Поля дескриптора процесса, имеющие отношение к обработке сигнала
Поле blocked хранит сигналы, замаскированные процессом на данный момент. Это массив sigset t, имеющий по одному биту на каждый тип сигнала:
typedef struct {
unsigned long sig[2];
} sigset_t;
Поскольку каждое число типа unsigned long включает в себя 32 бита, максимальное количество сигналов, объявляемых в Linux, равно 64 (это значение определяет макрос nsig). Поскольку сигнала с номером 0 нет, номер сигнала равен индексу соответствующего бита в переменной sigset t плюс единица. Номера с 1 по 31 соответствуют сигналам, а номера с 32 по 64 — сигналам реального времени.
Дескриптор сигнала и дескриптор обработчика сигналов
Поле signal дескриптора процесса указывает на дескриптор сигнала — структуру signai struct, которая отслеживает совместно используемые висящие сигналы. На самом деле, дескриптор сигнала включает в себя и поля, не имеющие непосредственного отношения к обработке сигналов, например, riirn— массив ограничений на ресурсы для каждого процесса или поля pgrp и session, в которых хранятся идентификаторы процессов для лидера группы
и, соответственно, лидера сессии данного процесса. Фактически, как уже было сказано в главе 3, дескриптор сигнала совместно используется всеми процессами, принадлежащими одной группе потоков, т. е. всеми процессами, созданными системным вызовом clone о с установленным флагом clone thread. Таким образом, дескриптор сигнала имеет поля, которые должны быть идентичными для каждого процесса в одной группе потоков.
Поля дескриптора сигнала, имеющие отношение к обработке сигналов.
Помимо дескриптора сигнала каждый процесс обращается к дескриптору обработчика сигналов. Это структура sighand struct, описывающая, как каждый сигнал должен быть обработан группой потоков.
дескриптор обработчика сигналов может быть совместно использован несколькими процессами, созданными системным вызовом clone о с установленным флагом clone sighand; при этом поле count этого дескриптора показывает количество процессов, совместно использующих данную структуру. В многопоточном приложении, удовлетворяющем стандарту POSIX, все облегченные процессы в группе потоков работают с одним дескриптором обработчика сигналов.
Предыдущая страница | 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 | Следующая страница