#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 ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΠΈΡΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΈ Π·Π°Ρ Π²Π°ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Π°, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ°Π½ΡΡΠ΅.