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

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

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

# 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() {