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);
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO;
// ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π³ΡΡΠΏΠΏΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
const int thrnum = 3;
for (int i = SIGRTMIN; i - SIGRTMIN < thrnum; i++) {
sigset_t sig;
sigemptyset(&sig);
sigaddset(&sig, 1);
// Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π»:
sigprocmask(SIG_BLOCK, &sig, NULL);
if (sigaction(i, &act, NULL) < 0) perror("set signal handler: ");
// Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΈΠ³Π½Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
// ΡΡΡΠΊ Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΎΠΉ ΡΠΈΠΏΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
pthread_create(NULL, NULL, threadfunc, (void*)(i));
}
// Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ².
for (int i = 0; ; i++) {
sleep(1);
// ΠΏΠΎΡΡΠ»ΠΊΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ (ΡΠ°ΠΊ Π΄Π°ΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π΅Π΅)
// ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
// union sigval val;
// val.sival_int = i;
// sigqueue(getpid(), SIGRTMIN + i % thrnum, val);
// Π½ΠΎ ΠΌΡ ΡΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΡΡΡ kill:
kill(getpid(), SIGRTMIN + i % thrnum);
}
}
Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΡ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΠΎΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
SIG = 41; TID = 2
SIG = 42; TID = 3
SIG = 43; TID = 4
SIG = 41; TID = 2
SIG = 42; TID = 3
SIG = 43; TID = 4
SIG = 41; TID = 2
SIG = 42; TID = 3
SIG = 43; TID = 4
Π§Π°ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ»ΡΡΠ°ΡΡ: Β«β¦Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠ³Π½Π°Π» Π²ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ, ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅β¦Β», ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π² ΠΏΠΎΡΠΎΠΊΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠΌ Ρ Π½Π΅ΠΉ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠΈ. ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ, ΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΠ°ΠΊΡΡ ΡΡ Π΅ΠΌΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ (ΡΠ°ΠΉΠ» s10.cc):
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΠΈΠ³Π½Π°Π»#include <stdio.h>
#include <iostream.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/neutrino.h>
#include <vector>
static void handler(int signo, siginfo_t* info, void* context) {
cout << "SIG = " << signo << ", TID = " << pthread_self() << endl;
}
static void endhandler(int signo) {}
// ΡΠΈΠ³Π½Π°Π», Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π³ΠΈΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ:
const int SIGNUM = SIGRTMIN;
sigset_t sig;
struct threcord {
int tid;
bool noblock;
};
static vector<threcord> tharray; // Π²Π΅ΠΊΡΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ²
void* threadfunc(void* data) {
// Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²:
sigset_t sigall;
sigfillset(&sigall);
SignalProcmask(0, 0, SIG_BLOCK, &sigall, NULL);
// ΠΏΠ΅ΡΠ΅Π΄Π΅ΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π΅ΠΊΡΠΎΡΠ°
sched_yield();
tharray[(int)data].noblock =
(SignalProcmask(0, 0, SIG_UNBLOCK, &sig, NULL) != -1);
while (true) {
pause();
tharray[(int)data].noblock =
!(SignalProcmask(0, 0, SIG_BLOCK, &sig, NULL) != 1);
bool nolast = false;
for (vector<threcord>::iterator i = tharray.begin();
i != tharray.end(); i++)
if (nolast = i->noblock) break;
// ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ»ΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ
if (nolast) kill(getpid(), SIGNUM);
// ... ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅ΡΡΠ»Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ΠΊΠΎΠΌΡ -
// ΠΏΠ΅ΡΠ΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΠΎΠΊ
else
for (vector<threcord>::iterator i = tharray.begin();
i != tharray.end(); i++)
i->noblock = (SignalProcmask(0, i->tid, SIG_UNBLOCK, &sig, NULL) != -1);
}
}
int main() {
// ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ ^C Π² ΡΡΠ°ΡΠΎΠΉ ΠΌΠ°Π½Π΅ΡΠ΅
signal(SIGINT, endhandler);
// ΠΌΠ°ΡΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ-ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ
sigemptyset(&sig);
sigaddset(&sig, SIGNUM);
// Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sigprocmask(SIG_BLOCK, &sig, NULL);
cout << "Process " << getpid() << ", waiting for signal " << SIGNUM << endl;
// ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (Π΄Π»Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²)
struct sigaction act;
act.sa_mask = sig;
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO;
if (sigaction(SIGNUM, &act, NULL) < 0) perror("set signal handler: ");
const int thrnum = 3;
for (int i = 0; i < thrnum; i++) {
threcord threc = { 0, false };
pthread_create(&threc.tid, NULL, threadfunc, (void*)i);
tharray.push_back(three);
}
pause();
// ΡΡΠ΄Π° ΠΌΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅ ^C Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ...
tharray.erase(tharray.begin(), tharray.end());
cout << "Clean vector" << endl;
}
ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ , ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΡΠΆΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ Π‘++, Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ vector ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ STL (Standard Template Library). ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ΅ΠΌΡ. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½Π°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΡΠΈΠ°ΡΠΈΠΉ) ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΠ½ΡΡΠ°Ρ Π² QNX ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½Π° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ°ΠΌΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ. ΠΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΠΏΡΠΎΡΡΠ°: ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΈΠ³Π½Π°Π», ΠΏΠΎΡΠΎΠΊ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΡΠΎΡ ΡΠΈΠ³Π½Π°Π», ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π°Π΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΈ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π·Π΄Π΅ΡΡ Π½Π΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π·Π΅Ρ ΡΠΎΠ³ΠΎ, Β«ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡΒ», Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π²Π°ΡΠΈΠΌ ΠΊΠ°ΠΏΡΠΈΠ·Π°ΠΌ, ΠΊΠ°ΠΊΠΈΠΌΠΈ Π±Ρ ΠΈΠ·ΠΎΡΡΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠ½ΠΈ Π½ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ.
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
# s10
Process 2089006, waiting for signal 41
ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΏΠΎΡΠ»Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΠΈΠΌ ΡΠΈΠ³Π½Π°Π», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
# kill -41 2089006
ΠΠΎΡΡΠ»Π°Π΅ΠΌ ΡΡΠΎΡ ΡΠΈΠ³Π½Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ 3) ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
SIG = 41; TID = 4
SIG = 41; TID = 2
SIG = 41; TID = 3
SIG = 41; TID = 3
SIG = 41; TID = 4
SIG = 41; TID = 2
SIG = 41; TID = 2
SIG = 41; TID = 3
SIG = 41; TID = 4
^C
Clean vector
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠ³Π½Π°Π» Π²ΠΎΠ·Π±ΡΠΆΠ΄Π°Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· (ΠΏΠΎ ΡΠΈΡΠ»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²), ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (TID). ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΊ ΡΠΈΠ³Π½Π°Π»Ρ, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ Β«ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΎΠ²ΡΠ²Π°ΡΡΡΡΒ» ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^C (ΡΠΈΠ³Π½Π°Π» SIGINT):
β’ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ; Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΡΡΠΊΡ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ²;
β’ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° SIGINT Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π² Β«Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉΒ» ΠΌΠ°Π½Π΅ΡΠ΅ Π² ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ Ρ ΠΌΠΎΠ΄Π΅Π»ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π΄Π»Ρ SIGRTMIN, ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ; Π²ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΈ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°.
ΠΠ°ΠΊ ΠΌΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π» ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΡΠΎΡ ΡΠΈΠ³Π½Π°Π» (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΈΠ³Π½Π°Π»), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π»ΡΠ±ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π»ΠΈΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π°Π½Π½ΡΡ , Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π² ΡΡΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅, Π½Π΅ Π² ΡΡΠ΅ΠΊΠ΅ ΠΏΠΎΡΠΎΠΊΠ° (ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ), Π° Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠ°Π½Π΅Π΅. Π‘Ρ Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΡΠ°ΠΊ:
β’ ΠΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ N ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Ρ SIGRTMINβ¦SIGRTMIN + (N - 1):
for (int i = SIGRTMIN, i < SIGRTMIN + N; i++) {
pthread_create(NULL, NULL, threadfunc, (void*)(i));
}
β’ ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ N ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°) ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΡ ΡΠ²ΠΎΠΈΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΎΠΊ (Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Β«Π§Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²Β»), ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ :
class DataBlock {
~DataBlock(void) {...}
};
static pthread_key_t key;
static pthread_once_t once = PTHREAD_ONCE_INIT;