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

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

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

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;

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

static void once_creator(void) {

Β pthread_key_create(&key, destructor);

}

void* threadfunc(void* data) {

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

Β // ...

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