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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

Π£ΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса структура

siginfo_t
содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля (Ρ‚Π°Π±Π». 2.20).

Π’Π°Π±Π»ΠΈΡ†Π° 2.20. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля структуры siginfo_t

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля
si_signo
Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
SIGILL SIGFPE
caddr_t si_addr
АдрСс нСдопустимой инструкции
SIGSEGV SIGBUS
caddr_t si_addr
АдрСс нСдопустимой области памяти
SIGCHLD
pid_t si_pid
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса
int si_status
Код Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° сигнала
SIGPOLL
long si_band
Ошибка ΠΊΠ°Π½Π°Π»Π° (для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ STREAMS)

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ маску сигналов ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ маску ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigprocmask(2):

#include <signal.h>

int sigprocmask(int how, sigset_t *set, sigset_t *oset);

Маска сигналов измСняСтся Π² соотвСтствии с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ

how
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

SIG_BLOCK
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ маска получится ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ маски ΠΈ Π½Π°Π±ΠΎΡ€Π°
set
SIG_UNBLOCK
Π‘ΠΈΠ³Π½Π°Π»Ρ‹ Π½Π°Π±ΠΎΡ€Π°
set
Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ маски
SIG_SETMASK
ВСкущая маска Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Π½Π° Π½Π°Π±ΠΎΡ€
set

Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

set
Ρ€Π°Π²Π΅Π½
NULL
, Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ how игнорируСтся. Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
oset
Π½Π΅ Ρ€Π°Π²Π΅Π½
NULL
, Ρ‚ΠΎ Π² Π½Π°Π±ΠΎΡ€, адрСсованный этим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, помСщаСтся тСкущая маска сигналов.

Ѐункция sigpending(2) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния Π½Π°Π±ΠΎΡ€Π° Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сигналов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… доставки:

#include <signal.h>

int sigpending(int how, sigset_t *set, sigset_t *oset);

Бписок сигналов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… доставки, возвращаСтся Π² Π½Π°Π±ΠΎΡ€Π΅, адрСсованном Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ

set
.

БистСмный Π²Ρ‹Π·ΠΎΠ² sigsuspend(2) Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ маску Π½Π°Π±ΠΎΡ€ΠΎΠΌ, адрСсованным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ

set
, ΠΈ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса Π΄ΠΎ получСния сигналов, диспозиция ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… установлСна Π»ΠΈΠ±ΠΎ Π½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ выполнСния процСсса, Π»ΠΈΠ±ΠΎ Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала.

#include <signal.h>

int sigsuspend(const sigset_t *set);

ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigsuspend(2) Π½Π΅ происходит. Если ΠΆΠ΅ диспозиция ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ сигнала установлСна Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· sisuspend(2) происходит сразу послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала. ΠŸΡ€ΠΈ этом восстанавливаСтся маска, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠ°Ρ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° sigsuspend(2).

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² BSD UNIX Π²Ρ‹Π·ΠΎΠ² signal(3) являСтся ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΌ интСрфСйсом ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigaction(2), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² Π²Π΅Ρ‚Π²ΠΈ System V signal(3) ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ использованиС старой сСмантики Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… сообраТСний, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal(), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ сигналы. ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ рСализация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² BSD UNIX. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой "Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ" вСрсии ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рассмотрСнный Π½Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅, Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

#include <signal.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

/* Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ "Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal() */

void (*mysignal(int signo, void (*hndlr)(int)))(int) {

Β struct sigaction act, oact;

Β /* Установим маску сигналов */

Β act.sa_handler = hndlr;

Β sigemptyset(&act.sa_mask);

Β act.sa_flags = 0;

Β if (signo != SIGALRM)

Β  act.sa_flags = SA_RESTART;

Β /* Установим Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ */

Β if (sigaction(signo, &act, &oact) < 0)

Β  return SIG_ERR;

Β return(oact.sa_handler);

}

/* Ѐункция-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала */

static void sig_hndlr(int signo) {

Β /* Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π°ΠΌ ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½Π°

Β  mysignal(SIGINT, sig_hndlr);

Β */

Β printf("ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал SIGINT\n");

}

main() {

Β /* Установим Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ */

Β mysignal(SIGINT, sig_hndlr);

Β mysignal(SIGUSR2, SIG_IGN);

Β /* БСсконСчный Ρ†ΠΈΠΊΠ» */

Β while (1)

Β  pause();

}

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала.

Π“Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ сСансы

ПослС создания процСсса Π΅ΠΌΡƒ присваиваСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ систСмным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ fork(2) Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ядро Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ процСссу ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов (process group ID). Π“Ρ€ΡƒΠΏΠΏΠ° процСссов Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ процСссов ΠΈ сущСствуСт, ΠΏΠΎΠΊΠ° Π² систСмС присутствуСт хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ процСсс этой Π³Ρ€ΡƒΠΏΠΏΡ‹. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π», Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с создания Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ, ΠΊΠΎΠ³Π΄Π° послСдний процСсс Π΅Π΅ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ‚, называСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹. ПослСдний процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ.