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

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

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 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;

<i>Β act.sa_handler = ouch;</i>

<i>Β sigemptyset(&amp;act.sa_mask);</i>

<i>Β act.sa_flags = 0;</i>

<i>Β sigaction(SIGINT, &amp;act, 0);</i>

Β while (1) {

Β  printf(&quot;Hello World!\n&quot;);

Β Β sleep(1);

Β }

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ всСгда Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСниС ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl>+<C>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ

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

$ <b>./ctrlc2</b>

Hello World!

Hello World!

Hello World!

<b>^C</b>

OUCH! - I got signal 2

Hello World!

Hello World!

<b>^C</b>

OUCH! - I got signal 2

Hello World!

Hello World!

<b>^\</b>

Quit

$

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

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

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

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

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

Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ signal.h ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏ

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

<b>#include &lt;signal.h&gt;</b>

<b>int sigaddset(sigset_t *set, int signo);</b>

<b>int sigemptyset(sigset_t *set);</b>

<b>int sigfillset(sigset_t *set);</b>

<b>int sigdelset(sigset_t *set, int signo);</b>

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ… названиям,

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

Ѐункция

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

<b>#include &lt;signal.h&gt;</b>

<b>int sigismember(sigset_t *set, int signo);</b>

Маска сигналов процСсса задаСтся ΠΈ просматриваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

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

<b>#include &lt;signal.h&gt;</b>

<b>int sigprocmask(int how, const sigset_t *set, sigset_t *oset);</b>

Ѐункция

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
.