Главная страница  Взаимодействие нетривиальных процессов 

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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

2. В версии 4.3BSD (1986) надежные сигналы были добавлены.

3. Версия System V Release 3.0 (1986) также добавила надежные сигналы, хотя и иначе, чем BSD.

4. Стандарт Posix.l (1990) увековечил модель надежных сигналов BSD, и эта модель подробно описана в главе 10 [21].

5. Posix.l (1996) добавил кмоделиРоз1хсигналыреальноговремени. Этопрои.з-росло из расширений реального времени Posix.lb (которые были названы Posix.4).

Почти все системы Unix в настоящее время поддерживают надежные сигналы, а новейшие системы предоставляют также и сигналы реального времени стандарта Posix. (Следует различать надежные сигналы и сигналы реального времени.) О сигналах реального времени следует поговорить подробнее, поскольку мы уже столкнулись с некоторыми структурами, определяемыми этим расширением стандарта, в предыдущем разделе (структуры sigval и sigevent).

Сигналы могут быть отнесены к двум группам:

1. Сигналы реального времени, которые могут принимать значения между SIGRTMIN и SIGRTMAX включительно. Posix требует, чтобы предоставлялось по крайней мере RTSIGMAX сигналов, и минимальное значение этой константы равно 8.

2. Все прочие сигналы: SIGALRM, SIGINT, SIGKILL и пр.

ПРИМЕЧАНИЕ-

В Solaris 2.6 обычные сигналы Unix нумеруются с 1 по 37, а 8 сигналов реального времени имеют номера с 38 по 45. В Digital Unix 4.0В обычные сигналы нумеруются с 1 по 32, а 16 сигналов реального времени имеют номера с 33 по 48. Обе реализации определяют SIGRTMIN и SIGRTMAX как макросы, вызывающие sysconf, что позволяет изменять их значения.

Далее все зависит от того, установлен ли процессом, получившим сигнал, флаг SASIGINFO при вызове sigaction. В итоге получаются четыре возможных сценария, приведенных в табл. 5.2.

Таблица 5.2. Поведение сигналов Posix в реальном времени в зависимости OTSA SIGINFO

Сигнал

Флаг SA.SIGINFO указан

Флаг SA SIGINFO не указан

От SIGRTMIN до SIGRTMAX Все прочие сигаалы

Гарантируются характеристики реального времени Характеристики реального времени не обязательны

Характеристики реального времени не обязательны

Характеристики реального времени не обязательны

Смысл фразы характеристики реального времени не обязательны следующий: некоторые реализации могут обрабатывать эти сигналы как сигналы реального времени, но это не обязательно. Если мы хотим, чтобы сигналы обрабатывались как сигналы реального времени, мы должны использовать сигналы с номерами от SIGRTMIN до SIGRTMAX и должны указать флаг SASIGINFO при вызове si gacti on при установке обработчика сигнала.



Термин характеристики реального времени подразумевает следующее:

Сигналы помещаются в очередь. Если сигнал будет порожден трижды, он будет трижды получен адресатом. Более того, повторения одного и того же сигнала доставляются в порядке очереди (FIFO). Мы вскоре покажем пример очереди сигналов. Если же сигналы в очередь не помещаются, трижды порожденный сигнал будет получен лишь один раз.

Когда в очередь помещается множество неблокируемых сигналов в диапазоне SIGRTMIN-SIGRTMAX, сигналы с меньшими номерами доставляются раньше сигналов с большими номерами. То есть сигнал с номером SIGRTMIN имеет больший приоритет , чем сигнал с номером SIGRTMIN-i-1, и т. д.

При отправке сигнала, не обрабатываемого как сигнал реального времени, единственным аргументом обработчика является номер сигнала. Сигналы реального времени несут больше информации, чем прочие сигналы. Обработчик для сигнала реального времени, устанавливаемый с флагом SASIGINFO, объявляется как

void func(int signo. siginfo t *info. void *context): где signo - номер сигнала, a siginfot - структура, определяемая как

typedef struct {

int si signo: /* то же, что и signo */

int si code: /* SI {USER.QUEUE.TIMER,ASYNCIO.MESGQ} */

union sigval si value: /* целое или указатель от отправителя */ } siginfoj:

На что указывает context - зависит от реализации.

ПРИМЕЧАНИЕ

Обработчик сигналов, не являющихся сигналами реального времени, вызывается с единственным аргументом. Во многих системах существует старое соглашение о вызове обработчиков сигналов с тремя аргументами, которое предшествовало стандарту реального времени Posix.

Тип siginfo t является единственной структурой Posix, определяемой оператором typedef с именем, оканчивающимся на t. В листинге 5.14 мы объявляем указатели на эти структуры как siginfot * без слова struct.

Для работы с сигналами реального времени добавлено несколько новых функций. Например, для отправки сигнала какому-либо процессу используется функция sigqueue вместо kill. Новая функция позволяет отправить вместе с сигналом структуру sigval.

Сигналы реального времени порождаются нижеследующими функциями Posix.l, определяемыми значением si code, которое хранится в структуре siginfo t, передаваемой обработчику сигнала.

SI ASYNCIO - сигнал был порожден по завершении асинхронного запроса на ввод или вывод одной из функций Posix aioXXX, которые мы не рассматриваем;

SI MESGQ - сигнал был порожден при помещении сообщения в пустую очередь сообщений (как в разделе 5.6);



ii SI QUEUE - сигнал был отправлен функцией sigqueue. Пример будет вскоре приведен;

ш SI TIMER - сигнал был порожден по истечении установленного функцией timer settime времени. Эту функцию мы не описываем;

ш SI USER - сигнал был отправлен функцией кШ.

Если сигнал был порожден каким-либо другим событием, si code будет иметь значение, отличающееся от приведенных выше. Значение поля si va1 ue структуры siginfo t актуально только в том случае, если si code имеет одно из следующих значений: SI ASYNCIO, SI MESGQ, SI QUEUE и SIJIMER.

Пример

в листинге 5.14 приведен пример программы, демонстрирующей использование сигналов реального времени. Программа вызывает fork, дочерний процесс блокирует три сигнала реального времени, родительский процесс отправляет девять сигналов (три раза отсылается каждый из заблокированных сигналов), затем дочерний процесс разблокирует сигналы и мы смотрим, сколько раз будет получен каждый из них и в каком порядке они придут.

Листинг 5.14. Тестовая программа, иллюстрирующая работу с сигналами реального времени

rtsignals/testl.c

1 #include unpipc.h

2 static void sig rt(int. siginfo t *. void *):

3 int

4 mainCint argc. char **argv)

6 i nt i. j:

7 pid t pid:

8 sigset t newset:

9 union Sigval val:

10 printf( SIGRTMIN = %й. SIGRTMAX = %й\п . (int) SIGRTMIN. (int) SIGRTMAX);

11 if ( (pid = ForkO) == 0) {

12 /* дочерний процесс блокирует 3 сигнала */

13 Sigemptyset(&newset):

14 Sigaddset(&newset. SIGRTMAX):

15 Sigaddset(&newset. SIGRTMAX - 1):

16 Sigaddset(&newset. SIGRTMAX - 2);

17 Sigprocmask(SIG BLOCK. &newset. NULL):

18 /* установка обработчика с флагом SA SIGINFO */

19 Signal rt(SIGRTMAX. sig rt):

20 Signal rt(SIGRTMAX - 1. sig rt):

21 Signal rt(SIGRTMAX - 2. sig rt):

22 sleep(6): /* родительский процесс посылает все сигналы */

23 Sigprocmask(SIG UNBLOCK. &newset. NULL); /* разблокируемся */ л

продолжение



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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.