Π£ΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΡΡΡΠΊΡΡΡΠ°
siginfo_tΠ’Π°Π±Π»ΠΈΡΠ° 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);ΠΠ°ΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ
howSIG_BLOCK | Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ ΠΌΠ°ΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΌΠ°ΡΠΊΠΈ ΠΈ Π½Π°Π±ΠΎΡΠ° set |
SIG_UNBLOCK | Π‘ΠΈΠ³Π½Π°Π»Ρ Π½Π°Π±ΠΎΡΠ° set |
SIG_SETMASK | Π’Π΅ΠΊΡΡΠ°Ρ ΠΌΠ°ΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Π½Π° Π½Π°Π±ΠΎΡ set |
ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
setNULLosetNULLΠ€ΡΠ½ΠΊΡΠΈΡ 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). ΠΡΡΠΏΠΏΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΠΊΠ° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΎΠΉ Π³ΡΡΠΏΠΏΡ. ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π», Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉΡΡ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π³ΡΡΠΏΠΏΡ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΠΉΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π΅Π΅ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π³ΡΡΠΏΠΏΡ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² Π΄ΡΡΠ³ΡΡ Π³ΡΡΠΏΠΏΡ.