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

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

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

Рис. 25.2. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для хранСния ΠΏΡ€ΠΈΠ±Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ ΠΈ структур адрСсов ΠΈΡ… сокСтов

Π˜Π½Π΄Π΅ΠΊΡΡ‹ массивов

13-15 ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ iget являСтся индСксом ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта массива для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² основном Ρ†ΠΈΠΊΠ»Π΅, Π° пСрСмСнная iput β€” это индСкс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта массива, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сохраняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСйствия ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ nqueue ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ количСство Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² основном Ρ†ΠΈΠΊΠ»Π΅.

Π’ листингС 25.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ основной Ρ†ΠΈΠΊΠ» сСрвСра β€” функция dg_echo.

Листинг 25.2. Ѐункция dg_echo: основной ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ» сСрвСра

//sigio/dgecho01.c

19 void

20 dg_echo(int sockfd_arg, SA *pcliaddr, socklen_t clilen_arg)

21 {

22  int i;

23  const int on = 1;

24  sigset_t zeromask, newmask, oldmask;


25  sockfd = sockfd_arg;

26  clilen = clilen_arg;


27  for (i = 0; i < QSIZE; i++) { /* инициализация ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

28   dg[i].dg_data = Malloc(MAXDG);

29   dg[i].dg_sa = Malloc(clilen);

30   dg[i].dg_salen = clilen;

31  }

32  iget = iput = nqueue = 0;


33  Signal(SIGHUP, sig_hup);

34  Signal(SIGIO, sig_io);

35  Fcntl(sockfd, F_SETOWN, getpid());

36  Ioctl(sockfd, FIOASYNC, &on);

37  Ioctl(sockfd. FIONBIO, &on);


38  Sigemptyset(&zeromask); /* инициализация Ρ‚Ρ€Π΅Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² сигналов */

39  Sigemptyset(&oldmask);

40  Sigemptyset(&newmask);

41  Sigaddset(&newmask, SIGIO); /* сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ*/


42  Sigprocmask(SIG_BLOCK, &newmask, &oldmask);

43  for (;;) {

44   while (nqueue == 0)

45    sigsuspend(&zeromask); /* ΠΆΠ΄Π΅ΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ */


46   /* Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO */

47   Sigprocmask(SIG_SETMASK, &oldmask, NULL);


48   Sendto(sockfd, dg[iget].dg_data, dg[iget].dg_len, 0,

49    dg[iget].dg_sa, dg[iget].dg_salen);


50   if (++iget >= QSIZE)

51    iget = 0;


52   /* Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° SIGIO */

53   Sigprocmask(SIG_BLOCK, &newmask, &oldmask);

54   nqueue--;

55  }

56 }

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ принятых Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ

27-32 Π”Сскриптор сокСта сохраняСтся Π² глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ сигналов. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ инициализация ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ принятых Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ.

Установка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов ΠΈ Ρ„Π»Π°Π³ΠΎΠ² сокСтов

33-37 Π”ля сигналов SIGHUP (ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для диагностичСских Ρ†Π΅Π»Π΅ΠΉ) ΠΈ SIGIO ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fcntl задаСтся Π²Π»Π°Π΄Π΅Π»Π΅Ρ† сокСта, Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, управляСмого сигналом, ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π Π°Π½Π΅Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, управляСмого сигналом, Π² POSIX примСняСтся Ρ„Π»Π°Π³ O_ASYNC Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fcntl, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСм ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ioctl. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСм Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ„Π»Π°Π³ O_NONBLOCK для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, здСсь Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСн Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π°Π±ΠΎΡ€ΠΎΠ² сигналов

38-41 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ся Ρ‚Ρ€ΠΈ Π½Π°Π±ΠΎΡ€Π° сигналов: zeromask (Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняСтся), oldmask (Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ маску сигнала, ΠΊΠΎΠ³Π΄Π° SIGIO блокируСтся) ΠΈ newmask. Ѐункция sigaddset Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² Π½Π°Π±ΠΎΡ€ newmask Π±ΠΈΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ SIGIO.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… дСйствий

42-45 Π€ΡƒΠ½ΠΊΡ†ΠΈΡ sigprocmask сохраняСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ маску сигналов процСсса Π² oldmask, Π° Π·Π°Ρ‚Π΅ΠΌ выполняСт логичСскоС слоТСниС, сравнивая newmask с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ маской сигналов. Π’Π°ΠΊΠΈΠ΅ дСйствия Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ сигнал SIGIO ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ маску сигналов. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π·Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ†ΠΈΠΊΠ» for ΠΈ провСряСм счСтчик nqueue. Пока этот счСтчик Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sigsuspend. Π­Ρ‚Π° функция POSIX, сохранив Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ маску сигналов, присваиваСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ маскС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° zeromask. Π’Π°ΠΊ ΠΊΠ°ΠΊ zeromask являСтся пустым Π½Π°Π±ΠΎΡ€ΠΎΠΌ сигналов, Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ доставка Π»ΡŽΠ±Ρ‹Ρ… сигналов. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрСхватываСтся сигнал ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, функция sigsuspend Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. (Π­Ρ‚ΠΎ нСобычная функция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EINTR.) ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ, функция sigsuspend всСгда устанавливаСт Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ маски сигналов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΎ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Ρƒ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС newmask). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ гарантируСтся, Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° функция sigsuspend Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, сигнал SIGIO Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. ИмСнно поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ счСтчик nqueue, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ извСстно, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° ΠΎΠ½ провСряСтся, сигнал SIGIO Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доставлСн.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

А Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли сигнал SIGIO Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π²ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ совмСстно основным Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигналов? ΠœΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° nqueue ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° сразу послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ сигнал ΠΈ nqueue станСт Ρ€Π°Π²Π½Π° 1. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sigsuspend ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ пропустим сигнал. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigsuspend ΠΌΡ‹ Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅ΠΌ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° оТидания, ΠΏΠΎΠΊΠ° Π½Π΅ поступит Π΄Ρ€ΡƒΠ³ΠΎΠΉ сигнал. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π³ΠΎΠ½ΠΎΠΊ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 20.5

Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚Π°

46-51 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ сигнал SIGIO с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° sigprocmask, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ маскС сигналов процСсса Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, сохранСнноС Ρ€Π°Π½Π΅Π΅ (oldmask). Π’ этом случаС ΠΎΡ‚Π²Π΅Ρ‚ посылаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendto. ИндСкс iget увСличился Π½Π° 1, ΠΈ Ссли Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ совпадаСт с количСством элСмСнтов массива, ΠΎΠ½ снова обнуляСтся. Массив ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал SIGIO Π²ΠΎ врСмя измСнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iget, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот индСкс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² основном Ρ†ΠΈΠΊΠ»Π΅ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO

52-54 Π‘ΠΈΠ³Π½Π°Π» SIGIO блокируСтся, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 1. Π’ΠΎ врСмя измСнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно основным Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнал SIGIO Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΊΠΎΠ³Π΄Π° Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π° происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ способом являСтся ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigprocmask, находящихся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° for, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сигнала ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Однако ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации вСсь Ρ†ΠΈΠΊΠ» выполняСтся ΠΏΡ€ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ сигналС, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ быстроту рСагирования ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала. ΠŸΡ€ΠΈ этом Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ (Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΡ„Π΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сокСта достаточно Π²Π΅Π»ΠΈΠΊ), Π½ΠΎ Π²Ρ‹Π΄Π°Ρ‡Π° сигнала процСссу Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° врСмя блокирования сигнала. Одной ΠΈΠ· Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ создании ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, производящих ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигналов, Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ минимизация Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ блокирования сигнала.

Листинг 25.3. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала SIGIO

//sigio/dgecho01.c

57 static void

58 sig_io(int signo)

59 {

60  ssize_t len;

61  int nread;

62  DG *ptr;

63  for (nread = 0;;) {

64   if (nqueue >= QSIZE)

65    err_quit("receive overflow");


66   ptr = &dg[iput];

67   ptr->dg_salen = clilen;

68   len = recvfrom(sockfd, ptr->dg_data, MAXDG, 0,

69    ptr->dg_sa, &ptr->dg_salen);

70   if (len < 0) {

71    if (errno == EWOULDBLOCK)

72     break; /* всС сдСлано; ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ отсутствуСт */

73    else

74     err_sys("recvfrom error");

75   }

76   ptr->dg_len = len;


77   nread++;

78   nqueue++;

79   if (++iput >= QSIZE)

80    iput = 0;


81  }

82  cntread[nread]++; /* гистограмма количСства Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ.

                         считанных для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сигнала */

83 }

Π’ΠΎ врСмя создания этих ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов Π±Ρ‹Π»Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π² стандартС POSIX сигналы ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²ΠΎ врСмя прСбывания Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигналов (ΠΏΡ€ΠΈ этом сигнал Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½) Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π΅Ρ‰Π΅ Π΄Π²Π° сигнала, Ρ‚ΠΎ сигнал доставляСтся Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ стандартС POSIX прСдусмотрСно нСсколько сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… обСспСчиваСтся буфСризация, ΠΎΠ΄Π½Π°ΠΊΠΎ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… сигналов, Π² Ρ‚ΠΎΠΌ числС ΠΈ SIGIO, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° доставку.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий. ΠŸΡ€ΠΈΠ±Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° ΠΈ выдаСтся сигнал. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала считываСт Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΊ основному Ρ†ΠΈΠΊΠ»Ρƒ. Но Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала приходят Π΅Ρ‰Π΅ Π΄Π²Π΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, вызывая Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ сигнала Π΅Ρ‰Π΅ Π΄Π²Π°ΠΆΠ΄Ρ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сигнал Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сигнала, ΠΎΠ½ запустится снова всСго лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ПослС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ запуска ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ считываСт Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ оставлСна Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ приходящих Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ сокСта. Π­Ρ‚Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли (ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π°) ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ чСтвСртая. Когда ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ чСтвСртая Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°, считана ΠΈ поставлСна Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ основным Ρ†ΠΈΠΊΠ»ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ, Π° Π½Π΅ чСтвСртая Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°.