}
ΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΡΠ΄ΠΎΠΌ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ², ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΉ ΠΈ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΈΡΠΎΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² ΠΏΡΠΎΡΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠΎΡ ΠΊΠ°ΠΊ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΉΠΌ-Π°ΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π² TCP/IP-ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ [9]:
void alarm_handler(int sig) { return; }
int main() {
Β ...
Β signal(SIGALRM, alarm_handler); alarm(5);
Β int rc = connect( ... );
Β alarm(0);
Β if (rc < 0 && errno == EINTR)
Β cout << "ΠΡΡΠ΅ΠΊ ΡΠ°ΠΉΠΌ-Π°ΡΡ" << endl, exit(EXIT_FAILURE);
Β ...
}
ΠΠ΄Π΅ΡΡ ΡΠΌΠ΅ΡΡΠ½ΠΎ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²ΠΎ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ΅ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ±Π΄Π΅Π»ΡΠ΅ΡΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°Ρ
ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ: Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² API (
connect()
,
delay()
,
wait()
,
waitid()
ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅) Π±ΡΠ΄ΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°. Π’Π°ΠΊΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ API, ΠΊΠ°ΠΊ
pause()
ΠΈ
sigwait()
, Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ°ΡΡΠΈΠ²Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΡ
Π½ΠΈΡ
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠ΄Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ
errno
Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
EINTR
, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΎΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΠΌ ΠΈΠ·Π²Π½Π΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ. ΠΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²ΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
if (delay(100) != 0)
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ
delay()
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΡΠ°ΡΠΎΠΊ Β«Π·Π°ΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎΒ» Π΅ΠΉ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ ΠΈΠ·Π²Π½Π΅ (Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Β«Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡΒ» ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ).
ΠΠΎΠ΄Π΅Π»Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ²
Π Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ (Β«Π½ΠΎΠ²ΠΎΠΉΒ») ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠΉ Π΅ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ²) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π½Π΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, Π° Π½Π°Π±ΠΎΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² β ΡΠΈΠΏ
sigset_t
.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
POSIX ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΏ
sigset_t
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ»ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΌΠΎΠ³ Β«Π²ΠΌΠ΅ΡΡΠΈΡΡΒ» Π²ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ; Π΄Π»Ρ QNX ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ°Π²Π½ΠΎ 64. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°
sigset_t
Π² QNX, ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΡ
Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅
<target_nto.h>
:
struct { long bits[2]; }
ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠΏ
sigset_t
β ΡΡΠΎ Π±ΠΈΡΠΎΠ²Π°Ρ ΠΌΠ°ΡΠΊΠ°, Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π·Π½Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ Π½ΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΡΠ°ΠΊ ΡΡΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎ ΡΡΠΎΡ ΡΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ.
ΠΠ»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΡ
Π½Π°Π±ΠΎΡΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ:
β’Β
sigemptyset(sigset_t *set)
β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π½Π°Π±ΠΎΡ
set
, ΠΈΡΠΊΠ»ΡΡΠ°Ρ ΠΈΠ· Π½Π΅Π³ΠΎ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ;
β’Β
sigfillset(sigset_t *set)
β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π½Π°Π±ΠΎΡ
set
, Π²ΠΊΠ»ΡΡΠ°Ρ Π² Π½Π΅Π³ΠΎ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ;
β’Β
sigaddset(sigset_t *set, int signo)
β Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ
set
Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΡΠΈΠ³Π½Π°Π»
signo
;
β’Β
sigdelset(sigset_t *set, int signo)
β ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΈΠ· ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ°
set
Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΡΠΈΠ³Π½Π°Π»
signo
.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅
signo
Π² ΡΡΠ½ΠΊΡΠΈΡΡ
Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΡΠΈΠ³Π½Π°Π»Ρ (ΡΠ°ΠΊΠ°Ρ ΠΊΠ°ΠΊ
SIGINT
), Π»ΠΈΠ±ΠΎ ΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π°, Π½ΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠ΄ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ΅Π³ΠΊΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ, ΠΏΠΎΠ»ΡΠ·ΡΡΡΡ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΡΡ ΡΡΠΈΡ
4-Ρ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
sigset_t sig;
sigemptyset(&sig);
sigaddset(&sig, SIGPOLL);
sigaddset(&sig, SIGALRM);
ΠΡΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Π΄Π²ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ²:
SIGPOLL
ΠΈ
SIGALRM
.
ΠΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Π² ΡΡΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ:
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
Π³Π΄Π΅
signo
β Π½ΠΎΠΌΠ΅Ρ (ΠΈΠΌΡ) ΡΠΈΠ³Π½Π°Π»Π°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΡ;
act
β ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°;
oact
β ΡΡΡΡΠΊΡΡΡΠ° (Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅
NULL
), Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ).
Π‘ΡΡΡΠΊΡΡΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
sigaction
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ°ΠΊ (ΠΌΡ ΠΈΡΠΊΠ»ΡΡΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Watcom, QNX 4.X):
struct sigaction {
#define sa_handler un._sa_handler
#define sa_sigaction un._sa_sigaction
Β union {
Β Β void (*_sa_handler)(_SIG_ARGS);
Β Β void (*_sa_sigaction)(int, siginfo_t*, void*);
Β } un;
Β int sa_flags;
Β sigset_t sa_mask;
};
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΎΡΠΌΠ΅, Π½ΠΎ Π½Π΅ ΠΏΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² POSIX ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΡ
UNIX [5] (ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠ°ΡΠΊΠΈ ΠΈ ΡΠ»Π°Π³ΠΎΠ²; ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΏΡΠ΅Π³ΡΠ°Π΄ΠΎΠΉ Π΄Π»Ρ ΠΏΡΡΠΌΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ Π² ΡΡΠΈΠ»Π΅ C++ ΠΈΠ· ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΠΈ):
struct sigaction {
Β /* ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° */
Β void (*sa_handler)(int);
Β /* ΡΠΈΠ³Π½Π°Π»Ρ, Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ */
Β sigset_t sa_mask;
Β /* ΡΠ»Π°Π³ΠΈ, Π²Π»ΠΈΡΡΡΠΈΠ΅ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π° */
Β int sa_flags;
Β /* ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° */
Β void (*sa_sigaction)(int, siginfo_t*, void*);
};
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ
#define
Π² ΠΏΠ΅ΡΠ²ΡΡ
ΡΡΡΠΎΠΊΠ°Ρ
ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ β ΡΡΠΎ ΠΎΠ±ΡΡΠ½Π°Ρ Π² QNX ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ², Β«Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡΠΈΡ
Β» Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ
(Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ
) ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ (
union
). ΠΠ΅Π³ΠΊΠΎ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡ Π² ΡΡΠΈΡ
Π΄Π²ΡΡ
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ
(QNX ΠΈ POSIX) Π±ΡΠ΄ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ Π·Π΄Π΅ΡΡ ΠΎΡΠΎΠ±ΠΎΠΉ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ.