Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

Оба случая относятся ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π³ΠΎΠ½ΠΊΠΈ. Одним Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ являСтся ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большСС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, создав Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° появлСниС сигнала. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала устанавливаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² 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_t
β€” для использования с Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ„Π»Π°Π³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. ИдСя, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°ΡΡΡ Π·Π° этим ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ присвоСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ этого Ρ‚ΠΈΠΏΠ° являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ: Ρ‚.Π΅. ΠΎΠ½ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ Π΄Π΅Π»ΠΈΠΌΠΎΠ΅ дСйствиС. НапримСр, Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ машин присвоСниС значСния
int
осущСствляСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ инициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² структурС осущСствляСтся Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ копирования всСх Π±Π°ΠΉΡ‚ΠΎΠ² Π² (сгСнСрированном компилятором) Ρ†ΠΈΠΊΠ»Π΅, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции Β«Π±Π»ΠΎΡ‡Π½ΠΎΠ³ΠΎ копирования», которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ присвоСниС значСния
sig_atomic_t
являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ, Ρ€Π°Π· Π½Π°Ρ‡Π°Π²ΡˆΠΈΡΡŒ, ΠΎΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сигнал ΠΈ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

НаличиС особого Ρ‚ΠΈΠΏΠ° являСтся лишь Ρ‡Π°ΡΡ‚ΡŒΡŽ истории. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

sig_atomic_t
Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ
volatile
:

volatile sig_atomic_t sig_int_flag = 0; /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала устанавливаСт Π² true */

/* ...ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅... */

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово

volatile
сообщаСт компилятору, Ρ‡Ρ‚ΠΎ пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΈΠ·Π²Π½Π΅, Π·Π° спиной компилятора, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ позволяСт компилятору ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ прилоТСния ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

sig_atomic_t
Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ обращСния с сигналами ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π°Π»Π΅Π΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.7 Β«Π‘ΠΈΠ³Π½Π°Π»Ρ‹ для мСТпроцСссного взаимодСйствия».

10.4.6. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдостСрСТСния

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX прСдусматриваСт для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов нСсколько прСдостСрСТСний:

β€’Β Π§Ρ‚ΠΎ случаСтся, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для

SIGFPE
,
SIGILL
,
SIGSEGV
ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… сигналов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Β«Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ», Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

‒ Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π°

abort()
,
raise()
ΠΈΠ»ΠΈ
kill()
, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ
raise()
.
abort()
описана Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.4 Β«Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ самоубийства:
abort()
Β», a
kill()
описана Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅. (Описанная Π΄Π°Π»Π΅Π΅ функция API
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()