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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 132

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

#include <signal.h>

int sigaction<int sig, const struct sigaction *act, struct sigaction *oact);

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° sigaction, примСняСмая для опрСдСлСния дСйствий, ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ sig, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ signal.h ΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

void (*)(int)sa_handler /* функция, SIG_DFL ΠΈΠ»ΠΈ SIG_IGN */

sigset_t sa_mask        /* сигналы, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ для sa_handler */

int sa_flags            /* ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ дСйствий сигнала */

Ѐункция sigaction Π·Π°Π΄Π°Π΅Ρ‚ дСйствиС, связанноС с сигналом sig. Если oact Π½Π΅ null, sigaction записываСт ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ дСйствиС для сигнала Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ oact мСсто. Если act Ρ€Π°Π²Π΅Π½ null, это всС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ функция sigaction. Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ act Π½Π΅ null, задаСтся дСйствиС для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ сигнала.

Как ΠΈ функция signal, sigaction Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния ΠΈ -1 Π² случаС ошибки. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ errno ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EINVAL, Ссли Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ сигнал Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½ ΠΈΠ»ΠΈ Π±Ρ‹Π»Π° прСдпринята ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСльзя Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ структурС sigaction, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ act, sa_handler β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала sig. Она ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ func, которая, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»Π°ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния SIG_IGN ΠΈ SIG_DFL Π² ΠΏΠΎΠ»Π΅ sa_handler для обозначСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сигнал Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ восстановлСно дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, соотвСтствСнно.

ПолС sa_mask описываСт мноТСство сигналов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² маску сигналов процСсса ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sa_handler. Π­Ρ‚ΠΎ мноТСство сигналов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ процСссу. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ возникновСнию ситуации, описанной Ρ€Π°Π½Π΅Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сигнал Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ дошСл Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ поля sa_mask ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ это состояниС Π³ΠΎΠ½ΠΎΠΊ.

Однако сигналы, Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² структурС sigaction, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»Π΅ sa_flags Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SA_RESETHAND, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ повСдСния, Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΡ€ΠΈ обсуТдСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ sigaction, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ctrlc.c, примСняя sigaction вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.9).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.9. Ѐункция sigaction

ВнСситС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π»Π΅Π΅ измСнСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнал SIGINT пСрСхватывался sigaction. НазовитС Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ctrlc2.c.

#include <signal.h>

#include <stdio.h>

#include <unistd.h>


void ouch(int sig) {

 printf("OUCH! - I got signal %d\n", sig);

}


int main() {

 struct sigaction act;

 act.sa_handler = ouch;

 sigemptyset(&act.sa_mask);

 act.sa_flags = 0;

 sigaction(SIGINT, &act, 0);

 while (1) {

  printf("Hello World!\n");

  sleep(1);

 }

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ всСгда Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСниС ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl>+<C>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ SIGINT обрабатываСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sigaction. Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ слСдуСт Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<\>, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сигнал SIIGQUIT.

$ ./ctrlc2

Hello World!

Hello World!

Hello World!

^C

OUCH! - I got signal 2

Hello World!

Hello World!

^C

OUCH! - I got signal 2

Hello World!

Hello World!

^\

Quit

$

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ sigaction для задания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ouch ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl>+<C> (SIGINT). ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ структуру sigaction, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, маску сигналов ΠΈ Ρ„Π»Π°Π³ΠΈ, Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ, ΠΈ создаСтся пустая маска сигналов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigemptyset.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ПослС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ ядра (Π² Ρ„Π°ΠΉΠ»Π΅ core). Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ бСзбоязнСнно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° сигналов

Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ signal.h ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏ sigset_t ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, примСняСмыС для манипулирования мноТСствами сигналов. Π­Ρ‚ΠΈ мноТСства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² sigaction ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… функциях для измСнСния повСдСния процСсса ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигналов.

#include <signal.h>

int sigaddset(sigset_t *set, int signo);

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigdelset(sigset_t *set, int signo);

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ… названиям, sigemptyset ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ пустоС мноТСство сигналов. Ѐункция sigfillset ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ мноТСство сигналов, заполняя Π΅Π³ΠΎ всСми Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ сигналами, sigaddset ΠΈ sigdelset Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ сигнал (signo) Π² мноТСство сигналов ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΈΠ· мноТСства. Они всС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ -1 Π² случаС ошибки, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno. ЕдинствСнная опрСдСлСнная ошибка EINVAL описываСт сигнал ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ.

Ѐункция sigismember опрСдСляСт, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π»ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ сигнал Π² мноТСство сигналов. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1, Ссли сигнал являСтся элСмСнтом мноТСства, 0, Ссли Π½Π΅Ρ‚ ΠΈ -1 с errno, Ρ€Π°Π²Π½ΠΎΠΉ EINVAL, Ссли сигнал Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ.

#include <signal.h>

int sigismember(sigset_t *set, int signo);

Маска сигналов процСсса задаСтся ΠΈ просматриваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigprocmask. Маска сигналов β€” это мноТСство сигналов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ процСссом.

#include <signal.h>

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

Ѐункция sigprocmask ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ маску сигналов процСсса Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами Π² соотвСтствии с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ how. НовыС значСния маски сигналов ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ set, Ссли ΠΎΠ½ Π½Π΅ Ρ€Π°Π²Π΅Π½ null, Π° прСдыдущая маска сигналов Π±ΡƒΠ΄Π΅Ρ‚ записана Π² мноТСство сигналов oset.

АргумСнт how ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

β–‘ SIG_BLOCK β€” сигналы Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° set Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊ маскС сигналов;

β–‘ SIG_SETMASK —маска сигналов задаСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ set;

β–‘ SIG_UNBLOCK β€” сигналы Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ set ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· маски сигналов.

Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ set Ρ€Π°Π²Π΅Π½ null, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ how Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ СдинствСнная Ρ†Π΅Π»ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° β€” пСрСнСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ маски сигналов Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ oset.

Если функция sigprocmask Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. Ѐункция Π²Π΅Ρ€Π½Π΅Ρ‚ -1, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ how Π½Π΅Π²Π΅Ρ€Π΅Π½, Π² этом случаС пСрСмСнная errno Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° EINVAL.

Если сигнал Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ процСссом, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доставлСн, Π½ΠΎ останСтся ΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigpending, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Сю сигналов ΠΆΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

#include <signal.h>

int sigpending(sigset_t *set);

Она записываСт мноТСство сигналов, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ доставки ΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π² мноТСство сигналов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ set. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΈ -1 Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno, содСрТащСй ΠΎΡˆΠΈΠ±ΠΊΡƒ. Данная функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ потрСбуСтся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сигналы ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigsuspend процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доставлСн ΠΎΠ΄ΠΈΠ½ сигнал ΠΈΠ· мноТСства сигналов. Π­Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ общая Ρ„ΠΎΡ€ΠΌΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pause, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ.

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

Ѐункция sigsuspend Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ маску сигналов процСсса мноТСством сигналов, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ sigmask, ΠΈ Π·Π°Ρ‚Π΅ΠΌ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Оно Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ послС выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ сигнал Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, sigsuspend Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ Π΅ΠΉ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ сигнал Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, sigsuspend Π²Π΅Ρ€Π½Π΅Ρ‚ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno, Ρ€Π°Π²Π½ΠΎΠΉ EINTR.

Π€Π»Π°Π³ΠΈ sigaction

ПолС sa_flags структуры sigaction, примСняСмой Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigaction, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ значСния, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сигнала (Ρ‚Π°Π±Π». 11.5).


Π’Π°Π±Π»ΠΈΡ†Π° 11.5

Имя сигнала ОписаниС SA_NOCLDSTOP НС гСнСрируСтся SIGCHLD, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ процСссы остановлСны SA_RESETHAND ВосстанавливаСт ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ дСйствиС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ SIG_DFL SA_RESTART ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСсто ошибки EINTR SA_NODEFER ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сигнала Π½Π΅ добавляСт Π΅Π³ΠΎ Π° маску сигналов

Π€Π»Π°Π³ SA_RESETHAND ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для автоматичСской очистки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сигнала ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ сигнала, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅.