CHILD: signal mask set

signal sent: 39 with val = 0

signal sent: 39 with val = 1

signal sent: 40 with val = 0

signal sent: 40 with val = 1

signal sent: 41 with val = 0

signal sent: 41 with val = 1

PARENT finished!

# CHILD: signal unblock

received signal 41 code = -2 val = 0

received signal 41 code = -2 val = 1

received signal 40 code = -2 val = 0

received signal 40 code = -2 val = 1

received signal 39 code = -2 val = 0

received signal 39 code = -2 val = 1

Для них реакция никак не отличается от реакции на другие сигналы, что, впрочем, неудивительно, учитывая замечание в цитировавшемся выше фрагменте документации о том, что возбуждение сигнала и посылка импульса (сообщения) микроядра в QNX — одно и то же, и обрабатываются они единым механизмом.

Посмотрим также реакцию системы на специальные сигналы QNX, номера которых выше SIGRTMAX (в исследуемый диапазон опять для сравнения включим как специальные сигналы (57…64), так и сигналы из диапазона 1…SIGRTMAX):

# ./s5 -b56 -e59 -n2

signal SIGRTMIN=41 - signal SIGRTMAX=56

set signal handler... Invalid argument

set signal handler... Invalid argument

set signal handler... Invalid argument

CHILD: signal mask set

signal sent: 56 with val = 0

signal sent: 56 with val = 1

signal sent: 57 with val = 0

signal sent: 57 with val = 1

signal sent: 58 with val = 0

signal sent: 58 with val = 1

signal sent: 59 with val = 0

signal sent: 59 with val = 1

PARENT: finished!

# CHILD: signal unblock

received signal 56 code = -2 val = 0

received signal 56 code = -2 val = 1

Из вывода видно, что на сигнал с номером 56 реакция ожидаемая, а на остальные сигналы реакции нет вовсе. Как и следует из предупреждения в документации, заблокировать или изменить реакцию на эти сигналы невозможно, и попытка установки sigaction() для них завершается ошибкой.

Таким образом, система фактически никак не выделяет сигналы диапазона реального времени (41…56), но обрабатывает аналогичным образом и стандартные сигналы UNIX (1…31), и специальные сигналы QNX (57…64), и даже сигналы, никак не специфицируемые системой вообще (32…40). Корректнее говорить не об обработке сигналов реального времени и даже не о модели сигналов реального времени, а об еще одном способе работы с любыми сигналами - обработке сигналов на базе очередей сигналов.

Примечание

Для полноты картины приведем конкретную спецификацию типа siginfo_t для QNX (выше мы рассматривали минимальную спецификацию этого типа, требуемую POSIX). Спецификация весьма объемна (вся информация до конца раздела может быть безболезненно пропущена теми, кому это неинтересно), но предоставляет программисту исчерпывающую информацию о полученном сигнале:

typedef struct {

 int si_signo;

 int si_code; /* if SI_NOINFO, only si_signo is valid */

 int si_errno;

 union {

  int __pad[7];

  struct {

   pid_t __pid;

   union {

    struct {

     uid_t __uid;

     union sigval __value;

    } kill; /* si_code <= 0 SI_FROMUSER */

    struct {

     _CSTD clock_t __utime;

     /* CLD_EXITED status, else signo */

     int _status;

     _CSTD clock_t __stime;

    } __chld;

    /* si_signo=SlGCHLD si_code=CLD_* */

   } __pdata;

  } __proc;

  struct {

   int __fltno;

   void* __fltip;

   void* __addr;

  } fault; /* si_signo=SIGSEGV,ILL,FPE,TRAP,BUS */

 } __data;

} siginfo_t;

#define si_pid    __data.__proc.__pid

#define si_value  __data.__proc.__pdata.__kill.__value

#define si_uid    __data.__proc.__pdata.__kill.__uid

#define si_status __data.__proc.__pdata.__chld.__status

#define si_utime  __data.__proc.__pdata.__chld.__utime

#define si_stime  __data.__proc.__pdata.__chld.__stime

#define si_fltno  __data.__fault.__fltno

#define si_trapno si_fltno

#define si_addr   __data.__fault.__addr

#define si_fltip  __data.__fault.__fltip

И полный перечень определений символьных констант, используемых для установки значений поля si_code:

#define SI_USER      0

#define SI_RESERVED1 (-1)

#define SI_QUEUE     (-2)

#define SI_TIMER     (-3)

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату