ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΊ ΡΠΈΠ³Π½Π°Π»Π°ΠΌ UNIX ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠ°Ρ, Π½ΠΎ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠ°Ρ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ signal(3C). ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΄ΡΠΎΠΌ UNIX. ΠΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ fork(2) ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΎΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ exec(2) Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ°Π· Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ exec(2). Π€ΡΠ½ΠΊΡΠΈΡ signal(3C) ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:
#include <signal.h>void(*signal(int sig, void (*disp)(int)))(int);ΠΡΠ³ΡΠΌΠ΅Π½Ρ
sigΠΡΠ³ΡΠΌΠ΅Π½Ρ
dispSIG_DFL | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΄ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, Ρ.Π΅. Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. |
SIG_IGN | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΈΠ³Π½Π°Π» ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π½Π΅ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ. |
Π ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ signal(3C) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡΒ β ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
SIGSIG_IGNΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ signal(3C) ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ ΠΈΠ»ΠΈ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ Π²Π΅ΡΡΠΌΠ° ΡΠ»Π°Π±ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π», Ρ. Π΅. ΠΎΡΠ»ΠΎΠΆΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π° Π½Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ° ΠΊΠΎΠ΄Π°. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π°, Π΅Π³ΠΎ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ Π΅ΠΉ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌ Π² Π½ΠΎΠ²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ signal(3C). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π»Ρ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΉ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ:
#include <signal.h>/* Π€ΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° */static void sig_hndlr(int signo) {Β /* ΠΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ */Β signal(SIGINT, sig_hndlr);Β printf("ΠΠΎΠ»ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» SIGINT\n");}main() {Β /* Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ */Β signal(SIGINT, sih_hndlr);Β signal(SIGUSR1, SIG_DFL);Β signal(SIGUSR2, SIG_IGN);Β /* ΠΠ΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» */Β while(1)Β pause();}Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²:
SIGINTSIGUSR1SIGUSR2SIGINTSIGUSR1SIGUSR2EINTRSIGINTΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
$ <b>Π°.out &</b>[1] 8365Β Β Β Β Β Β Β Β Β Β Β Β $ <b>kill -SIGINT 8365</b>ΠΠΎΠ»ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» SIGINT$ <b>kill -SIGUSR2 8365 </b>$ <b>kill -SIGUSR1 8365 </b>[1]+ User Signal 1Β Β a.outΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β $ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° kill(1), ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅.
ΠΠ°Π΄Π΅ΠΆΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ
Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX. 1 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ» Π½ΠΎΠ²ΡΠΉ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ. ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ 4.2BSD UNIX ΠΈ Π»ΠΈΡΠ΅Π½Π½ΡΠΉ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π²ΡΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ².
ΠΠΎΠ΄Π΅Π»Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ POSIX, ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΠΏΠΎΠ½ΡΡΠΈΠΈ Π½Π°Π±ΠΎΡΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (signal set), ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΠΏΠ°
sigset_tsigset_tΠ‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π½Π°Π±ΠΎΡΠ°ΠΌΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²:
#include <signal.h>int sigempyset(sigset_t *set);int siufillset(sigset_t *set);int sigaddset(sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);int sigismember(sigset_t *set, int signo);Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ signal(3C), ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠ΅ΠΉ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
sigset_tΠ€ΡΠ½ΠΊΡΠΈΡ sigemptyset(3C) ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π½Π°Π±ΠΎΡ, ΠΎΡΠΈΡΠ°Ρ Π²ΡΠ΅ Π±ΠΈΡΡ. ΠΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ sigfillset(3C), ΡΠΎ Π½Π°Π±ΠΎΡ Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ΅. Π€ΡΠ½ΠΊΡΠΈΠΈ sigaddset(3C) ΠΈ sigdelset(3C) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠΈΠ³Π½Π°Π»Ρ Π½Π°Π±ΠΎΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ sigismember(3C) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π²Ρ ΠΎΠ΄ΠΈΡ Π»ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ
signoΠΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ signal(3C) ΡΡΠ°Π½Π΄Π°ΡΡ POSIX. 1 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ sigaction(2), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΡΠ·Π½Π°ΡΡ Π΅Π΅ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: