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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 153

Автор Уильям БтивСнс

Листинг 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 ΠœΡ‹ выдСляСм Π±ΡƒΡ„Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наша функция ΠΈ Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigsetjmp

20-23 ΠšΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sigsetjmp нСпосрСдствСнно ΠΈΠ· нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dg_cli, ΠΎΠ½Π° устанавливаСт Π±ΡƒΡ„Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»ΡŒ. ΠœΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ дальшС ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvfrom.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигнала SIGALRM ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ siglongjmp

31-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 ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала ΠΈ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ