//rtsignals/test1.c
1 #include "unpipc.h"
2 static void sig_rt(int, siginfo_t *, void *);
3 int
4 main(int argc, char **argv)
5 {
6 int i, j;
7 pid_t pid;
8 sigset_t newset;
9 union sigval val;
10 printf("SIGRTMIN = %d, SIGRTMAX = %d\n", (int) SIGRTMIN, (int) SIGRTMAX);
11 if ((pid = Fork()) == 0) {
12 /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ 3 ΡΠΈΠ³Π½Π°Π»Π° */
13 Sigemptyset(&newset);
14 Sigaddset(&newset, SIGRTMAX);
15 Sigaddset(&newset, SIGRTMAX β 1);
16 Sigaddset(&newset, SIGRTMAX β 2);
17 Sigprocmask(SIG_BLOCK, &newset, NULL);
18 /* ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Ρ ΡΠ»Π°Π³ΠΎΠΌ SA_SIGINFO */
19 Signal_rt(SIGRTMAX, sig_rt);
20 Signal_rt(SIGRTMAX β 1, sig_rt);
21 Signal_rt(SIGRTMAX β 2, sig_rt);
22 sleep(6); /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΡΠ»Π°Π΅Ρ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ */
23 Sigprocmask(SIG UNBLOCK, &newset, NULL); /* ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ */
24 sleep(3); /* ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π»Ρ */
25 exit(O);
26 }
27 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ */
28 sleep(3); /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ */
29 for (i = SIGRTMAX; i >= SIGRTMAX β 2; i--) {
30 for (j = 0; j <= 2; j++) {
31 val.sival_int = j;
32 Sigqueue(pid, i, val);
33 printf("sent signal %d, val = %d\n", i, j);
34 }
35 }
36 exit(0);
37 }
38 static void
39 sig_rt(int signo, siginfo_t *info, void *context)
40 {
41 printf(received signal #%d, code = %d, ival = %d\n",
42 signo.info->si_code, info->si_value.sival_int);
43 }
ΠΡΠ²ΠΎΠ΄ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ10 ΠΡ ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΠΎΠ±Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΊ ΡΠΈΠΏΡ integer, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ ΠΎΠ½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΎΡΡ, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Π° sysconf, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
#define SIGRTMAX (sysconf(_SC_RTSIG_MAX))
ΠΈ ΡΡΠ½ΠΊΡΠΈΡ sysconf Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΠΏΠ° long (ΡΠΌ. ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.4).
ΠΡΠ·ΠΎΠ² fork ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ11-17 ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ sigprocmask Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ: SIGRTMAX, SIGRTMAX-1 ΠΈ SIGRTMAX-2.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°18-21 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ signal_rt (ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.15) Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ sig_rt Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³ SA_SIGINFO, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΡΡΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²22-25 ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΆΠ΄Π΅Ρ 6 ΡΠ΅ΠΊΡΠ½Π΄, ΠΏΠΎΠΊΠ° ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠ΄ΠΈΡ Π΄Π΅Π²ΡΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ sigprocmask Π΄Π»Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌ Π΄ΠΎΡΡΠΈΡΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠ°. ΠΠ°ΡΠ΅ΠΌ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠ°ΡΠ·Π° Π΅ΡΠ΅ Π½Π° ΡΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠΏΠ΅Π» Π²ΡΠ·Π²Π°ΡΡ printf Π΄Π΅Π²ΡΡΡ ΡΠ°Π·, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ.
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π΅Π²ΡΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²27-36 Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΆΠ΄Π΅Ρ ΡΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΏΠΎΠΊΠ° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ. ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ ΡΡΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ: i ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ 3 Π·Π½Π°ΡΠ΅Π½ΠΈΡ, a j ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 0, 1 ΠΈ 2 Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ i. ΠΡ ΠΏΡΠ΅Π΄Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π»Ρ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅Π³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΡΠ»Π°Π΅ΠΌ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΈΠ· ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ sigval_int, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠ³Π½Π°Π»Π° Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ, ΡΠΎ Π΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ.
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π°38-43 ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π΅.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠ· ΡΠ°Π±Π». 5.1 ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ printf Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΡΠΈΠΏΠ° async-signal-safe ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π° Π² ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠΉ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Solaris 2.6. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π½Π΅ ΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ:
solaris % test1
SIGRTMIN = 38, SIGRTMAX = 45 8 ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΡΡΠ΅Ρ ΡΠ΅ΠΊΡΠ½Π΄Π½Π°Ρ ΠΏΠ°ΡΠ·Π°
sent signal 45, val = 0
sent signal 45, val = 1
sent signal 45, val = 2
sent signal 44, val = 0
sent signal 44, val = 1
sent signal 44, val = 2
sent signal 43, val = 0
sent signal 43, val = 1
sent signal 43, val = 2
solaris % ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ°Π±ΠΎΡΡ, ΠΏΠ°ΡΠ·Π° 3 ΡΠ΅ΠΊΡΠ½Π΄Ρ,
ΠΏΠΎΠΊΠ° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ
received signal #45, code = β2, ival = 2 Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ
received signal #45, code = β2, ival = 1
received signal #45, code = β2, ival = 0
received signal #44, code = β2, ival = 2
received signal #44, code = β2, ival = 1
received signal #44, code = β2, ival = 0
received signal #43, code = β2, ival = 2
received signal #43, code = β2, ival = 1
received signal #43, code = β2, ival = 0
Π ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π΄Π΅Π²ΡΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π½ΠΎ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΠΈΠ³Π½Π°Π»Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅ΡΠ°ΠΌΠΈ (Π° ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΠ³Π½Π°Π»Ρ Ρ ΠΌΠ΅Π½ΡΡΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅ΡΠ°ΠΌΠΈ).
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΈΠ³Π½Π°Π»Ρ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ LIFO, Π° Π½Π΅ FIFO. ΠΠΎΠ΄ si_code = β2 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ SI_QUEUE.
ΠΠ°ΠΏΡΡΡΠΈΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Digital Unix 4.0B, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ:
alpha % test1
SIGRTMIN = 33, SIGRTMAX = 48 16 ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΡΡΠ΅Ρ ΡΠ΅ΠΊΡΠ½Π΄Π½Π°Ρ ΠΏΠ°ΡΠ·Π°
sent signal 48, val = 0
sent signal 48, val = 1
sent signal 48, val = 2
sent signal 47, val = 0
sent signal 47, val = 1
sent signal 47, val = 2
sent signal 46, val = 0
sent signal 46, val = 1
sent signal 46, val = 2
alpha % ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ°Π±ΠΎΡΡ, ΠΏΠ°ΡΠ·Π° 3 ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΏΠΎΠΊΠ° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΠΈΠ³Π½Π°Π»Ρ
received signal #46, code β β1, ival = 0 Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ
received signal #46, code = β1, ival = 1
received signal #46, code = β1, ival = 2
received signal #47, code β β1, ival = 0
received signal #47, code = β1, ival = 1
received signal #47, code = β1, ival = 2
received signal #48, code = β1, ival = 0
received signal #48, code = β1, ival = 1
received signal #48, code = β1, ival = 2
ΠΠ΅Π²ΡΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠΎΠΌ Π² ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅: ΠΏΠ΅ΡΠ²ΡΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΈΠ³Π½Π°Π» Ρ ΠΌΠ΅Π½ΡΡΠΈΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ, Π° ΠΊΠΎΠΏΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ FIFO.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Solaris 2.6 Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ signal_rt
Π ΠΊΠ½ΠΈΠ³Π΅ [24, Ρ. 120] ΠΌΡ ΠΏΡΠΈΠ²Π΅Π»ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ signal, Π²ΡΠ·ΡΠ²Π°Π²ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ sigaction ΡΡΠ°Π½Π΄Π°ΡΡΠ° Posix Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ Posix. ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΡ Π½Π°Π·ΠΎΠ²Π΅ΠΌ signal_rt; Π΅Π΅ ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.15.
ΠΠΈΡΡΠΈΠ½Π³ 5.15. Π€ΡΠ½ΠΊΡΠΈΡ signal_rt Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ//lib/signal_rt.c
1 #include "unpipc.h"
2 Sigfunc_rt *
3 signal_rt(int signo, Sigfunc_rt *func)
4 {
5 struct sigaction act, oact;
6 act.sa_sigaction = func; /* ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ */
7 sigemptyset(&act.sa_mask);
8 act.sa_flags = SA_SIGINFO; /* Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠ΅ΠΆΠΈΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ */
9 if (signo == SIGALRM) {
10 #ifdef SA_INTERRUPT
11 act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
12 #endif
13 } else {
14 #ifdef SA_RESTART
15 act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
16 #endif
17 }
18 if (sigaction(signo, &act, &oact) < 0)
19 return((Sigfunc_rt *) SIG_ERR);
20 return(oact.sa_sigaction);
21 }
Π£ΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ typedef1-3 Π Π½Π°ΡΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ unpiΡΡ.h (Π»ΠΈΡΡΠΈΠ½Π³ Π.1) ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Sigfunc_rt ΠΊΠ°ΠΊ
typedef void Sigfunc_rt(int, siginfo_t*, void*);
Π Π°Π½Π΅Π΅ Π² ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ ΡΠ»Π°Π³ΠΎΠΌ SA_SIGINFO.
Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Π‘ΡΡΡΠΊΡΡΡΠ° sigaction ΠΏΡΠ΅ΡΠ΅ΡΠΏΠ΅Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠΈΠ³Π½Π°-5-7 Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ: ΠΊ Π½Π΅ΠΉ Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ sa_sigaction:
struct sigaction {
void (*sa_handler)(); /* SIG_DFL, SIG_IGN ΠΈΠ»ΠΈ Π°Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° */