Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 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(&act.sa_mask);</i>
<i>Β act.sa_flags = 0;</i>
<i>Β sigaction(SIGINT, &act, 0);</i>
Β while (1) {
Β printf("Hello World!\n");
Β Β 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 <signal.h></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 <signal.h></b>
<b>int sigismember(sigset_t *set, int signo);</b>
ΠΠ°ΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° Π·Π°Π΄Π°Π΅ΡΡΡ ΠΈ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ
sigprocmask
. ΠΠ°ΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² β ΡΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ.
<b>#include <signal.h></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
.