ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ ΡΠ°Π·Π½ΠΎΡΡΠ΅Π½ΠΈΠΉ Π² Π²ΠΎΠΏΡΠΎΡΠ΅, ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΊ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΏΡΠΈΠ½ΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ:
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);