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

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

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

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ Π² вопросС, обратимся сначала ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡƒΡŽ модСль:

The original POSIX specification defined signal operation on processes only. In a multi-threaded process, the following rules are followed:

*The signal actions are maintained at the process level. If a thread ignores or catches a signal, it affects all threads within the process.

*The signal mask is maintained at the thread level. If a thread blocks a signal, it affects only that thread.

*An un-ignored signal targeted at a thread will be delivered to that thread alone.

*An un-ignored signal targeted at a process is delivered to the first thread that doesn't have the signal blocked. If all threads have the signal blocked, the signal will be queued on the process until any thread ignores or unblocks the signal. If ignored, the signal on the process will be removed. If unblocked, the signal will be moved from the process to the thread that unblocked it.

ВсС достаточно ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ процСсса, Π° Π²ΠΎΡ‚ ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹Π΅ маски, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅, Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ сигнал, - Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Для манипулирования ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ масками Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π°ΠΌ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SignalProcmask()[34] (СстСствСнно, ΠΈΠ· состава native API, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта модСль Π½Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° POSIX):

#include <sys/neutrino.h>

int SignalProcmask(pid_t pid, int tid, int how, const sigset_t* set,

 sigset_t* oldset);

Π’ΠΈΠ΄Π½Π° прямая аналогия с Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π²ΡˆΠ΅ΠΉΡΡ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sigprocmask(). Π”Π° это ΠΈ Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ sigprocmask() являСтся POSIX-Β«ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΎΠΉΒ» ΠΊ SignalProcmask(). Волько рассматриваСмый Π²Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Β«Π»ΠΈΡˆΠ½ΠΈΡ…Β» Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: PID ΠΈ TID ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊ маскС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ примСняСтся дСйствиС. Если pid β€” 0, Ρ‚ΠΎ прСдполагаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс, Ссли tid = 0, Ρ‚ΠΎ pid игнорируСтся ΠΈ прСдполагаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ sigprocmask() (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SIG_PENDING для how).

Рассмотрим, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° (Ρ„Π°ΠΉΠ» s6.cc):

Π‘ΠΈΠ³Π½Π°Π»Ρ‹, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…

#include <stdio.h>

#include <iostream.h>

#include <signal.h>

#include <unistd.h>

#include <pthread.h>

#include <time.h>

#include <sys/neutrino.h>


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

 cout << "SIG = " << signo << ";

 TID = " << pthread_self() << endl;

}


sigset_t sig;


void* threadfunc(void* data) {

 SignalProcmask(0, 0, SIG_UNBLOCK, &sig, NULL);

 while (true) pause();

}


int main() {

 sigemptyset(&sig);

 sigaddset(&sig, SIGRTMIN);

 sigprocmask(SIG_BLOCK, &sig, NULL);

 cout << "Process " << getpid() << ", waiting for signal " <<

  SIGRTMIN << endl;

 struct sigaction act;

 act.sa_mask = sig;

 act.sa_sigaction = handler;

 act.sa_flags = SA_SIGINFO;

 if (sigaction(SIGRTMIN, &act, NULL) < 0)

  perror("set signal handler: ");

 const int thrnum = 3;

 for (int i = 0; i < thrnum; i++)

  pthread_create(NULL, NULL, threadfunc, NULL);

 pause();

 exit(EXIT_SUCCESS);

}

Для Π°Π½Π°Π»ΠΈΠ·Π° этого ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ нСдостаточно ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ kill, поэтому сдСлаСм ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Β«ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΒ» ΠΏΠ»ΠΎΡ‚Π½ΠΎΠΉ (Π² смыслС минимального ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° слСдования) ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ сигналов (Ρ„Π°ΠΉΠ» k6.cc). Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого тСстСра, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅:

# k6 -p214005 -s41 -n100

направляСт процСссу с PID = 214005 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· 100 сигналов с ΠΊΠΎΠ΄ΠΎΠΌ 41 (SIGRTMIN). ΠŸΠΎΡΡ‹Π»Π°Ρ Π½Π°ΡˆΠ΅ΠΌΡƒ процСссу-тСстСру ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· N сигналов, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ N сообщСний Π²ΠΈΠ΄Π°:

SIG = 41; TID = 4

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

Π—Π΄Π΅ΡΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ случай ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сигналов Π½Π° Π±Π°Π·Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ простой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ (модСль Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов). Для этого Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π΄Π²Π΅ строки заполнСния структуры sigaction Π½Π°:

act.sa_handler = handler;

act.sa_flags = 0;

Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ handler() ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Ρ‚Π°ΠΊ: static void handler(int signo). Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π² точности ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ тСст, Ρ‚ΠΎ ΠΏΡ€ΠΈ посылкС процСссу- тСстСру ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· N сигналов ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ всСго ΠΎΠ΄Π½ΠΎ сообщСниС всС Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π²ΠΈΠ΄Π°. Π­Ρ‚ΠΎ наблюдСниС интСрСсно Π΅Ρ‰Π΅ ΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ взаимодСйствия сигнала с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° установлСна для этого сигнала: Π½Π° основС ΠΌΠΎΠ΄Π΅Π»ΠΈ сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π½Π° основС ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов.

Бколько Π±Ρ‹ Ρ€Π°Π· ΠΌΡ‹ Π½ΠΈ повторяли тСстированиС, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ сигнал, всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 4. Π§Ρ‚ΠΎ ΠΆΠ΅ происходит:

β€’ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (TID = 1) создаСт 3 Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ° (TID = 2, 3, 4);

β€’ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² пассивноС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ сигналов, Π½ΠΎ Π² Π΅Π³ΠΎ маскС доставка посылаСмого сигнала (41) Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π°;

β€’ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° начинаСтся с разблокирования ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ сигнала;

β€’ β€¦ 3 ΠΏΠΎΡ‚ΠΎΠΊΠ° (TID = 2, 3, 4) ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ поступлСния сигнала;

β€’ ΠΏΡ€ΠΈ поступлСнии сСрии сигналов вся ΠΈΡ… ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ доставляСтся ΠΈ обрабатываСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ с TID = 4, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π² Ρ†ΠΈΠΊΠ»Π΅ возвращаСтся ΠΊ оТиданию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… сигналов.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сигнал доставляСтся ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ этот сигнал. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала вызываСтся Π² контСкстС (стСк, области собствСнных Π΄Π°Π½Π½Ρ‹Ρ…) этого ΠΏΠΎΡ‚ΠΎΠΊΠ°. ПослС выполнСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнал поглощаСтся. ΠšΠ°ΠΊΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², находящихся Π² состоянии блокирования Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ сигналов (Π² масках ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π΄Π°Π½Π½Ρ‹ΠΉ сигнал), Π±ΡƒΠ΄Π΅Ρ‚ доставлСн экзСмпляр сигнала, ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ; это Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ исходя ΠΈΠ· ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² диспСтчСризации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Но Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ этим ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ являСтся ΠΏΠΎΡ‚ΠΎΠΊ, послСдним ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π΄ΡˆΠΈΠΉ Π² состояниС оТидания. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом, Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΡΠ»Π΅Π΄Π½ΡŽΡŽ строку ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (pause();) Π½Π°:

threadfunc(NULL);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас 4 Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° сигнала, пСрСходящих Π² состояниС оТидания Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: TID = 2, 3, 4, 1. РСакция процСсса Π½Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ сигнала измСнится Π½Π°:

SIG = 41, TID = 1

ИзмСним тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° (Ρ„Π°ΠΉΠ» s7.cc):

void* threadfunc(void* data) {

 while (true) {

  SignalProcmask(0, 0, SIG_UNBLOCK, &sig, NULL);

  delay(1);

  SignalProcmask(0, 0, SIG_BLOCK, &sig, NULL);

  delay(10);

 }

}

ПовСдСниС прилоТСния Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ измСнится β€” происходит смСна ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ объСм Π²Ρ‹Π²ΠΎΠ΄Π°, сСрии посылаСмых сигналов состоят ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ смСна ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° происходит ΠΌΠ΅ΠΆΠ΄Ρƒ сСриями, Π½ΠΎ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… сСрий, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ.

SIG = 41, TID = 1

SIG = 41; TID = 4

SIG = 41; TID = 4

SIG = 41; TID = 1

SIG = 41; TID = 1

SIG = 41; TID = 4

SIG = 41; TID = 4

SIG = 41; TID = 1

SIG = 41; TID = 2

SIG = 41; TID = 2

SIG = 41; TID = 3

SIG = 41; TID = 4

Вакая модСль вряд Π»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½Π° Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ «сигналами Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…Β», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сигнал Π² Π½Π΅ΠΉ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ направляСтся процСссу ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ, содСрТащСму ΠΏΠΎΡ‚ΠΎΠΊΠΈ (ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ: Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ адрСсного пространства процСсса). И Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого Π² контСкстС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΈ Π² случаС мноТСствСнных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ сигнала, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Π² контСкстС ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…) выполняСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ процСсса (TID = 1) Π² этой схСмС участвуСт Π² Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠΌ качСствС (здСсь Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠ΅Π΅ΡΡ понятиС «рСакция процСсса Π½Π° сигнал» Π² строгом смыслС Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ).

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ вопросам: ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту схСму Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прилоТСниях? Рассмотрим сначала случай, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, свойствСнного Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅ΠΌΡƒ сигнала (Ρ„Π°ΠΉΠ» s9.cc):

Π§Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… сигналов

#include <stdio.h>

#include <iostream.h>

#include <signal.h>

#include <unistd.h>

#include <pthread.h>

#include <time.h>

#include <sys/neutrino.h>


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

 cout << "SIG = " << signo << "; TID = " << pthread_self() << endl;

}


void* threadfunc(void* data) {

 // Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° всС сигналы

 sigset_t sig;

 sigfillset(&sig);

 SignalProcmask(0, 0, SIG_BLOCK, &sig, NULL);

 // Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° свой сигнал

 sigemptyset(&sig);

 sigaddset(&sig, (int)data);

 SignalProcmask(0, 0, SIG_UNBLOCK, &sig, NULL);

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

 while (true) pause();

}


int main() {

 // для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСй Π³Ρ€ΡƒΠΏΠΏΡ‹ сигналов управлСния ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ

 // Π΅Π΄ΠΈΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ, ΠΈΠ½Π°Ρ‡Π΅ всС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

 struct sigaction act;

 sigemptyset(&act.sa_mask);