ΠΠ±Π° ΡΠ»ΡΡΠ°Ρ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π³ΠΎΠ½ΠΊΠΈ. ΠΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅Π΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠΎΠ·Π΄Π°Π² ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠ΅ Π½Π° ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² true ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ. ΠΠ°ΡΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ»Π°Π³ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ :
int sig_int_flag = 0; /* ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π² true */void int_handler(int signum) {Β sig_int_flag = 1;}int main(int argc, char **argv) {Β bsd_signal(SIGINT, int_handler);Β /* ...ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ... */Β if (sig_int_flag) {Β /* Π²ΠΎΠ·Π½ΠΈΠΊ SIGINT, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ */Β }Β /* ...ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ°... */}(ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΎΠΊΠ½ΠΎ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, Π½ΠΎ Π½Π΅ ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π΅Π³ΠΎ).
Π‘ΡΠ°Π½Π΄Π°ΡΡ Π‘ Π²Π²ΠΎΠ΄ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ β
sig_atomic_tintsig_atomic_tΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΡΠ°ΡΡΡΡ ΠΈΡΡΠΎΡΠΈΠΈ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
sig_atomic_tvolatilevolatile sig_atomic_t sig_int_flag = 0; /* ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π² true *//* ...ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅... */ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ
volatileΠ‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΎΠΊΡΡΠ³ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
sig_atomic_t10.4.6. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΡ
Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠΉ:
β’Β Π§ΡΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ
SIGFPESIGILLSIGSEGVβ’Β ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠ·ΠΎΠ²Π°
abort()raise()kill()raise()abort()abort()kill()sigaction()β’Β ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΡΠ·Π²Π°ΡΡ Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΡΠ°Π±Π». 10.2. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
<stdio.h><stdio.h><stdio.h>Π‘ΠΏΠΈΡΠΎΠΊ Π² ΡΠ°Π±Π». 10.2 ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° 2.4 ΡΠΎΠΌΠ° System Interfaces (Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ) ΡΡΠ°Π½Π΄Π°ΡΡΠ° POSIX 2001. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎΠΌΡ API ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅.
Π’Π°Π±Π»ΠΈΡΠ° 10.2. Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°
_Exit() | fpathconf() | raise() | sigqueue() |
_exit() | fstat() | read() | sigset() |
accept() | fsync() | readlink() | sigsuspend() |
access() | ftruncate() | recv() | sleep() |
aio_error() | getegid() | recvfrom() | socket() |
aio_return() | geteuid() | recvmsg() | socketpair() |
aio_suspend() | getgid() | rename() | stat() |
alarm() | getgroups() | rmdir() | sysmlink() |
bind() | getpeername() | select() | sysconf() |
cfgetispeed() | getpgrp() | sem_post() | tcdrain() |
cfgetospeed() | getpid() | send() | tcflow() |
cfsetispeed() | getppid() | sendmsg() | tcflush() |
cfsetospeed() | getsockname() | sendto() | tcgetattr() |
chdir() | getsockopt() | setgid() | tcgetpgrp() |
chmod() | getuid() | setpgid() | tcsendbreak() |
chown() | kill() | setsid() | tcsetattr() |
clock_gettime() | link() | setsockopt() | tcsetpgrp() |
close() | listen() | setuid() | time() |
connect() | lseek() | shutdown() | timer_getoverrun() |
creat() | lstat() | sigaction() | timer_gettime() |
dup() | mkdir() | sigaddset() | timer_settime() |
dup2() | mkfifo() | sigdelset() | times() |
execle() | open() | sigemptyset() | umask() |
execve() | pathconf() | sigfillset() | uname() |
fchmod() | pause() | sigismember() | unlink() |
fchown() | pipe() | signal() | utime() |
fcntl() | poll() | sigpause() | wait() |
fdatasync() | posix_trace_event() | sigpending() | waitpid() |
fork() | pselect() | sigprocmask() | write() |