Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

static pthread_once_t once = PTHREAD_ONCE_INIT;

static void destructor(void* db) { delete (DataBlock*)db; }

static void once_creator(void) {

 pthread_key_create(&key, destructor);

}


void* threadfunc(void* data) {

 // Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ маскируСм сигналы

 // ...

 // это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈΠ· N

 pthread_once(&once, once_creator);

 DataBlock* pdb = new DataBlock(...);

 pthread_setspecific(key, pdb);

 // Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ *pdb, ΠΊΠ°ΠΊ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ!

 // Ρ†ΠΈΠΊΠ» оТидания приходящих сигналов:

 while (true) pause();

}

ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для всСх сигналов; ΠΎΠ½ выполняСт ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ дСйствия, Π½ΠΎ Π½Π°Π΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Над ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствиС, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Β«ΡƒΠ·Π½Π°Π΅Ρ‚Β» ΠΈΠ· контСкста ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ выполняСтся:

static void handler(int signo, siginfo_t* info, void* context) {

 DataBlock* pdb = (DataBlock*)pthread_getspecific(key);

 // выполняСм дСйствия для своСго ΠΏΠΎΡ‚ΠΎΠΊΠ° ...

}

β€’ Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° процСсса (Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π±Ρ€Π°Π½ для простоты - источником сигнала ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π΄Π°ΠΆΠ΅ Π½Π΅ этого процСсса), Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ дСйствиС вызываСтся Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сигнала:

sigqueue(getpid(), SIGRTMIN + K, val);

Π­Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ скСлСтная схСма, Π½ΠΎ Π½Π° Π΅Π΅ основС ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ взят ΠΈΠ· работоспособного прилоТСния).

Π—Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ POSIX: сигналы Π² сСти

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Β«Π½Π° закуску», посмотрим ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ систСмной ΠΊΠΎΠΌΠ°Π½Π΄Π΅ kill (ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сигнал). Π’Ρ‹, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ, ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² QNX Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ справку ΠΏΠΎ любой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ систСмы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ # use <имя-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹>. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈ Π² любоС своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ справки. Как это происходит, описано Π² [4]. Π˜Ρ‚Π°ΠΊ:

# use kill

kill - terminate or signal processes (POSIX)


kill [-signal_name|-signal_number] pid ...

kill -l

Options:

 -signal_name   Symbolic name of signal to send

 -signal_number Integer representing a signal type

 -l             List symbolic signal names

 -n             node Kill processes on the specified node.

                (/bin/kill only)


Where:

 Valid signal names are:


SIGNULL SIGHUP     SIGINT  SIGQUIT  SIGILL  SIGTRAP

SIGIOT  SIGABRT    SIGEMT  SIGFPE   SIGKILL SIGBUS

SIGSEGV SIGSYS     SIGPIPE SIGALRM  SIGTERM SIGUSR1

SIGUSR2 SIGCHLD    SIGPWR  SIGWINCH SIGURG  SIGPOLL SIGSTOP SIGTSTP

SIGCONT SIGVTALARM SIGTTIN SIGTTOU

Note:

kill is also available as a shell builtin

Π—Π΄Π΅ΡΡŒ нас ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ. И Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ эта строка ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² систСмС QNX сигнал ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒΡΡ процСссу, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ Π½Π° любом ΡƒΠ·Π»Π΅ сСти QNET. И это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнно, Ссли Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅Π»ΡŒΠΊΠ½ΡƒΠ²ΡˆΠ΅Π΅ Π²Ρ‹ΡˆΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΈΠ· тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ сигнал Π² QNX - это ΠΏΡƒΠ»ΡŒΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΈΠ΄ΠΎΠ² сообщСний микроядра.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, систСмная ΠΊΠΎΠΌΠ°Π½Π΄Π° QNX kill (ΠΈΠΌΠ΅Π½Π½ΠΎ систСмная β€” /bin/kill, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ встроСнной Ρ„ΠΎΡ€ΠΌΡ‹ kill ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строго ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ традициям UNIX, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ выдСлСнная Π½Π°ΠΌΠΈ строка) ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы Π»ΡŽΠ±ΠΎΠΌΡƒ процСссу Π² сСти. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΈ рассмотрСнии ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² kill() ΠΈ sigqueue() ΠΌΡ‹ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈ слСда ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ процСсс. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° kill? Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Ρ‹Π·ΠΎΠ² native QNX API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит Ρ‚Π°ΠΊ (этот Π²Ρ‹Π·ΠΎΠ², ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹, вторая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся бСзопасной Π² ΠΌΠ½ΠΎΠ³ΠΎ- ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС):

#include <sys/neutrino.h>

int SignalKill(uint32_t nd, pid_t pid,

 int tid, int signo, int code, int value);

int SignalKill_r(uint32_t nd, pid_t pid, int tid, int signo,

 int code int value);

Π³Π΄Π΅ nd β€” дСскриптор сСтСвого ΡƒΠ·Π»Π° QNET, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ pid ΠΈ tid. Для посылки сигнала Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ процСссу (ΠΏΠΎΡ‚ΠΎΠΊΡƒ) ΠΌΠΎΠΆΠ½ΠΎ для nd ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ 0, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ β€” ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ систСмой константу ND_LOCAL_NODE.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ДСскриптор ΡƒΠ·Π»Π° Π² сСти QNET β€” понятиС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅; ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ netmgr_strtond(). Но ΠΈ здСсь Π½Π΅ всС Ρ‚Π°ΠΊ просто:

β€’ Π”Сскриптор, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ, скаТСм, ΡƒΠ·Π»Ρƒ Β«hostΒ», ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΡƒΠ·Π»Π΅ «А», ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ N, Π½ΠΎ дСскриптор Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΡƒΠ·Π»Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΡƒΠ·Π»Π΅ Β«Π’Β», Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ M, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ дСскриптор ΡƒΠ·Π»Π° β€” это «дСскриптор сСтСвого ΡƒΠ·Π»Π° X, ΠΊΠ°ΠΊ ΠΎΠ½ видится с сСтСвого ΡƒΠ·Π»Π° YΒ».

β€’ Π’ΠΎΡ‚ ΠΆΠ΅ дСскриптор ΡƒΠ·Π»Π° Β«hostΒ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ N, Π½ΠΎ ΡƒΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· нСсколько сСкунд ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Β«ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒΒ» своС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° M, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ значСния, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ netmgr_strtond(), Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ...

Π­Ρ‚ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ слоТности относятся ΠΊ особСнностям ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ использования QNET ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ обсуТдСния. Однако ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ нашСго Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ рассмотрСния.

pid β€” PID процСсса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ направляСтся сигнал, pid ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈ этом ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (-pid) ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡƒ процСссов EGID, ΠΈ сигнал Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ всСм процСссам Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠŸΡ€ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ pid сигнал Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ всСм процСссам Π³Ρ€ΡƒΠΏΠΏΡ‹ процСсса отправитСля.

tid β€” 0 ΠΈΠ»ΠΈ TID ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ направляСтся сигнал. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ tid сигнал Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π° ΠΏΡ€ΠΈ tid = 0 β€” всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ процСсса. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ ΡΡƒΠ΄ΡŒΠ±Π° сигнала Π² ΠΎΠ±ΠΎΠΈΡ… случаях зависит ΠΎΡ‚ маскирования сигнала Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ рассматривали Ρ€Π°Π½Π΅Π΅.

signo β€” Π½ΠΎΠΌΠ΅Ρ€ сигнала (с Π½ΠΈΠΌ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ Π²Ρ‹ΡˆΠ΅).

code ΠΈ value β€” ΠΊΠΎΠ΄ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ассоциированныС с сигналом (ΠΈΡ… ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ встрСчали ΠΏΡ€ΠΈ рассмотрСнии ΠΌΠΎΠ΄Π΅Π»ΠΈ сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).

Как ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, внСшнСС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ (для программиста) основной Ρ„ΠΎΡ€ΠΌΡ‹ SignalKill() ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, бСзопасной Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС, SignalKill_r() состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ:

β€’ SignalKill() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 Π² случаС ошибки, Π° ΠΊΠΎΠ΄ ошибки заносится Π² errno; любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ являСтся ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния;

β€’ SignalKill_r() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EOK Π² случаС успСха, Π° Π² случаС ошибки возвращаСтся ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ошибки (Ρ‚ΠΎΡ‚ ΠΆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ основная Ρ„ΠΎΡ€ΠΌΠ° заносит Π² errno, Π½ΠΎ со Π·Π½Π°ΠΊΠΎΠΌ минус).

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ ошибок, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ этими Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ:

EINVAL β€” нСдопустимоС числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ signo;

ESRCH β€” Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ адрСсат (pid ΠΈΠ»ΠΈ tid);

EPERM β€” процСсс Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ достаточных ΠΏΡ€Π°Π² для посылки сигнала;

EAGAIN β€” нСдостаточно рСсурсов ядра для выполнСния запроса.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этой возмоТности, Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ любой ΠΈΠ· ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ²ΡˆΠΈΡ…ΡΡ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², разнСситС процСссы ΠΏΠΎ сСтСвым ΡƒΠ·Π»Π°ΠΌ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Β«Ρ†Π΅Π»Π΅ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅Β» Π² процСссС-ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ дСмонстрациСй ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π² сСти ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий:

β€’ ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ запуск Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

# on -f <host> raqc

β€’ ΠŸΠΎΡΠ»Π΅ Ρ‡Π΅Π³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ряд ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ [Ctrl+C] с локального Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ послСдствия этого «малСнького» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ стандартной POSIX-схСмы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сигналами:

β€’ ΠΠ° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ «сСтСвых сигналов» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ построСна цСлая систСма ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ сСтСвых ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ систСмы.

β€’ Π˜ΠΌΠ΅Π½Π½ΠΎ Β«ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉΒ» (Π½ΠΎ Π½Π΅ синхронизации с наслСдованиСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰Π΅ΠΉ Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ систСму диспСтчСризации ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… частСй ΠΈ Ρ‚.ΠΏ.): посылка сигнала являСтся Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°), Π° ΠΏΡ€ΠΈΠ΅ΠΌ сигнала Π½Π΅ сопровоТдаСтся наслСдованиСм (ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ) ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

β€’ Π’Π°ΠΊΠΎΠ΅ «сигнальноС» взаимодСйствиС, записанноС Π² Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ POSIX-сСмантикС (Π½ΠΎ, ΠΏΠΎ сути, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, Π΄Π°Π»Π΅ΠΊΠΎ выходящиС Π·Π° POSIX), ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π² записи ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ использовании Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями (ΠΏΡƒΠ»ΡŒΡΠ°ΠΌΠΈ).

4. ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации

ОБ QNX Neutrino прСдоставляСт ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ элСмСнтов синхронизации выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса, Ρ‚Π°ΠΊ ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ практичСски ΠΏΠΎΠ»Π½Ρ‹ΠΉ спСктр ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², описываСмых ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ стандартом POSIX, Ρ‚Π°ΠΊ ΠΈ всСми Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со всСми этими ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ для самой ОБ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, условная пСрСмСнная), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ β€” достаточно громоздкая надстройка Π½Π°Π΄ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ, рСализуСмая, Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΡƒΠ³ΠΎΠ΄Ρƒ POSIX.