ΠΠΈΡΡΠΈΠ½Π³ 20.3. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ pselect
//bcast/dgclibcast4.Ρ
1 #include "unp.h"
2 static void recvfrom_alarm(int);
3 void
4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
5 {
6 int n;
7 const int on = 1;
8 char sendline[MAXLINE], recvline[MAXLINE + 1];
9 fd_set rset;
10 sigset_t sigset_alrm, sigset_empty;
11 socklen_t len;
12 struct sockaddr *preply_addr;
13 preply_addr = Malloc(servlen);
14 Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
15 FD_ZERO(&rset);
16 Sigemptyset(&sigset_empty);
17 Sigemptyset(&sigset_alrm);
18 Sigaddset(&sigset_alrm, SIGALRM);
19 Signal(SIGALRM, recvfrom_alarm);
20 while (Fgets(sendline, MAXLINE, fp) != NULL) {
21 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
22 Sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);
23 alarm(5);
24 for (;;) {
25 FD_SET(sockfd, &rset);
26 n = pselect(sockfd + 1, &rset, NULL, NULL, NULL, &sigset_empty);
27 if (n < 0) {
28 if (errno == EINTR)
29 break;
30 else
31 err_sys("pselect error");
32 } else if (n != 1)
33 err_sys("pselect error; returned %d", n);
34 len = servlen;
35 n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
36 recvline[n] = 0; /* Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ Π½ΡΠ»Ρ */
37 printf("from %s: %s",
38 Sock_ntop_host(preply_addr, len), recvline);
39 }
40 }
41 free(preply_addr);
42 }
43 static void
44 recvfrom_alarm(int signo)
45 {
46 return; /* ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌ recvfrom() */
47 }
22-23 ΠΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ ΡΠΈΠ³Π½Π°Π» SIGALRM ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ pselect. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ β ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ sigset_empty, ΡΠ²Π»ΡΡΡΡΡΡΡ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ). Π€ΡΠ½ΠΊΡΠΈΡ pselect ΡΠΎΡ ΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΡΡΡΡ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ SIGALRM), ΠΏΡΠΎΠ²Π΅ΡΠΈΡ Π·Π°Π΄Π°Π½Π½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ, Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Ρ ΠΌΠ°ΡΠΊΠΎΠΉ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π² ΠΏΡΡΡΠΎΠΉ Π½Π°Π±ΠΎΡ, Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠ°ΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½Π° ΠΈΠΌΠ΅Π»Π° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ pselect. ΠΠ»ΡΡ ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ pselect Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΌΠ°ΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΌΠ°ΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° β ΡΡΠΎ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ.
34-38 ΠΡΠ»ΠΈ Π½Π°Ρ ΡΠΎΠΊΠ΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ recvfrom, Π·Π½Π°Ρ, ΡΡΠΎ ΠΎΠ½Π° Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ.
ΠΠ°ΠΊ ΠΌΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 6.9, ΡΡΠ½ΠΊΡΠΈΡ pselect β ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΠΎΠ²Π°Ρ ΡΡΠ΅Π΄ΠΈ Π΄ΡΡΠ³ΠΈΡ , ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ POSIX. ΠΠ· Π²ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π½Π° ΡΠΈΡ. 1.7, ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ FreeBSD ΠΈ Linux. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 20.4 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΏΡΠΎΡΡΠ°Ρ, Ρ ΠΎΡΡ ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°Ρ Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π΅ Π·Π΄Π΅ΡΡ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΡΠ°Π΄ΠΈΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ: ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΌΠ°ΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΌΠ°ΡΠΊΠΈ, ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΌΠ°ΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΠΈΡΡΠΈΠ½Π³ 20.4. ΠΡΠΎΡΡΠ°Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ pselect
//lib/pselect.c
9 #include "unp.h"
10 int
11 pselect(int nfds, fd_set *rset, fd_set *wset, fd_set *xset,
12 const struct timespec *ts, const sigset_t *sigmask)
13 {
14 int n;
15 struct timeval tv;
16 sigset_t savemask;
17 if (ts != NULL) {
18 tv.tv_sec = ts->tv_sec;
19 tv.tv_usec = ts->tv_nsec / 1000; /* Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ -> ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ */
20 }
21 sigprocmask(SIG_SETMASK, sigmask, &savemask); /* ΠΌΠ°ΡΠΊΠ° Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ
ΠΏΡΠΎΡΠ΅ΡΡΠ° */
22 n = select(nfds, rset, wset, xset., (ts == NULL) ? NULL : &tv);
23 sigprocmask(SIG_SETMASK, &savemask, NULL); /* Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ
ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΠΌΠ°ΡΠΊΡ */
24 return (n);
25 }
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ sigsetjmp ΠΈ siglongjmp
ΠΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΡΠ·Π²Π°Π² ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° ΡΡΠ½ΠΊΡΠΈΡ siglongjmp. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ goto (nonlocal goto), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π΄ΡΡΠ³ΡΡ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 20.5 ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π° ΡΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 20.5. ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ sigsetjmp ΠΈ siglongjmp ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°
//bcast/dgclibcast5.c
1 #include "unp.h"
2 #include <setjmp.h>
3 static void recvfrom_alarm(int);
4 static sigjmp_buf jmpbuf;
5 void
6 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
7 {
8 int n;
9 const int on = 1;
10 char sendline[MAXLINE], recvline[MAXLINE + 1];
11 socklen_t len;
12 struct sockaddr *preply_addr;
13 preply_addr = Malloc(servlen);
14 Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
15 Signal(SIGALRM, recvfrom_alarm);
16 while (Fgets(sendline, MAXLINE, fp) != NULL) {
17 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
18 alarm(5);
19 for (;;) {
20 if (sigsetjmp(jmpbuf, 1) != 0)
21 break;
22 len = servlen;
23 n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
24 recvline[n] = 0; /* null terminate */
25 printf("from %s: %s",
26 Sock_ntop_host(preply_addr, len), recvline);
27 }
28 }
29 free(preply_addr);
30 }
31 static void
32 recvfrom_alarm(int signo)
33 {
34 siglongjmp(jmpbuf, 1);
35 }
Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π² ΠΏΠ°ΠΌΡΡΠΈ4 ΠΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π±ΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π΅Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ sigsetjmp20-23 ΠΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sigsetjmp Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ dg_cli, ΠΎΠ½Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±ΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Ρ. ΠΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ recvfrom.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° SIGALRM ΠΈ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ siglongjmp31-35 ΠΠΎΠ³Π΄Π° ΡΠΈΠ³Π½Π°Π» Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ siglongjmp. ΠΡΠΎ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ sigsetjmp Π² ΡΡΠ½ΠΊΡΠΈΠΈ dg_cli Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ Π²ΡΠΎΡΠΎΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ (1), ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠΌ. ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠΊΠ»Π° for Π² ΡΡΠ½ΠΊΡΠΈΠΈ dg_cli.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ sigsetjmp ΠΈ siglongjmp ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΠΎΡΡΠ°Π½Π΅ΠΌΡΡ Π½Π°Π²ΡΠ΅Π³Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom ΠΈΠ·-Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° Π² Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΠ½ΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΡΠ»ΠΈ ΡΠΈΠ³Π½Π°Π» Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ printf ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ Π΄Π°Π½Π½ΡΡ , ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ ΠΈΠ· printf ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° sigsetjmp. ΠΡΠΈ ΡΡΠΎΠΌ Π² ΡΡΡΡΠΊΡΡΡΠ°Ρ Π΄Π°Π½Π½ΡΡ printf ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ. Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 20.2, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° goto.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ IPC Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΠ½ΠΊΡΠΈΠΈ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΏΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ Π½Π°Π΄Π΅Π΅ΠΌΡΡ, ΠΏΡΠ΅ΡΡΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ recvfrom, Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ΅Π΄ΡΡΠ² IPC (Interprocess Communications β Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²) ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ dg_cli ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈΡΡΠ΅ΠΊΠ»ΠΎ. ΠΡΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΠΎΠΌΡ Π½Π°ΠΌΠΈ ΡΠ°Π½ΡΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π» Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ had_alarm ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ°. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠ°Ρ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡ IPC (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° Π±ΡΠ»Π° Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΈ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠΈΠ³Π½Π°Π»Π°). ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΠ»Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΡΡΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΡΠΈΠ³Π½Π°Π» Π΄ΠΎΡΡΠ°Π²Π»ΡΠ»ΡΡ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΡΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ.
ΠΠΈΡΡΠΈΠ½Π³ 20.6 Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΊΠ°Π½Π°Π» 1 Π±Π°ΠΉΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°, Π° Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ dg_cli ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎΡ Π±Π°ΠΉΡ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΈΠΊΠ» for. Π§ΡΠΎ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π² ΡΡΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊΠ°Π½Π°Π»Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ select. Π‘ Π΅Π΅ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π³ΠΎΡΠΎΠ² Π»ΠΈ ΠΊ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Ρ ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π».
ΠΠΈΡΡΠΈΠ½Π³ 20.6. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ IPC ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π° ΠΈ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ