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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор Майкл ДТонсон

31:  sigemptyset(&mask);

32:  sigaddset(&mask, SIGRTMIN);

33:

34:  sigprocmask(SIG_BLOCK, &mask, &oldMask);

35:

36:  /* Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигналы */

37:  val.sival_int = 1;

38:  sigqueue(me, SIGRTMIN, val);

39:  val.sival_int++;

40:  sigqueue(me, SIGRTMIN, val);

41:  val.sival_int++;

42:  sigqueue(me, SIGRTMIN, val);

43:

44:  /* Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ доставку сигналов */

45:  sigprocmask(SIG_SETMASK, &oldMask, NULL);

46:

47:  return 0;

48: }

Π“Π»Π°Π²Π° 13

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²

Π’ Linux Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ большого количСства Π·Π°Π΄Π°Ρ‡, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, организация сСтСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сокСтов ΠΈ доступ ΠΊ устройствам посрСдством Ρ„Π°ΠΉΠ»ΠΎΠ² устройств. Π Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ созданию мноТСства ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… способов управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ Π³Π»Π°Π²Π΅ 11 Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнныС дСйствия с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ; Π² настоящСй ΠΆΠ΅ Π³Π»Π°Π²Π΅ ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ спСциализированныС Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ частности, ΠΌΡ‹ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы: использованиС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись вразброс.

13.1. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Многим ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрным прилоТСниям Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов. НапримСр, соврСмСнныС Web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько сСтСвых ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Web-страницы. Π­Ρ‚ΠΎ позволяСт ΠΈΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ мноТСство ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Web-страниц, быстрСС, Ρ‡Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ ΠΊΠ°Π½Π°Π»Π° мСТпроцСссных взаимодСйствий (IPC), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ графичСскими Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ для связи с X-сСрвСром, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с мноТСством Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов.

Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ Π»Π΅Π³Ρ‡Π΅ всСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹, считывая ΠΈ обрабатывая Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… (систСмный Π²Ρ‹Π·ΠΎΠ² read() Π² сСтСвом ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°Π½Π°Π»Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ доступныС Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС нСготовности). Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ эффСктивСн, ΠΏΠΎΠΊΠ° всС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ достаточно рСгулярно.

Если ΠΎΠ΄Π½ΠΎ ΠΈΠ· сСтСвых ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ являСтся ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Когда Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ снова считываСт ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π°, ΠΎΠ½ пСрСстаСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ read() блокируСтся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ поступлСния Π΄Π°Π½Π½Ρ‹Ρ…. НС стоит ΠΈ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ являСтся ΡƒΠ΄ΠΎΠ±ΠΎΠ²Π°Ρ€ΠΈΠΌΡ‹ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ рассмотрим ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², p1 ΠΈ p2. Для Π΅Π΅ испытания ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚Ρ€ΠΈ сСанса Ρ€Π°Π±ΠΎΡ‚Ρ‹ с X-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ (ΠΈΠ»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ трСмя Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ консолями). Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ p1 ΠΈ p2 (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mknod), Π·Π°Ρ‚Π΅ΠΌ запуститС cat > p1 ΠΈ cat > p2 Π² Π΄Π²ΡƒΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ запустив mpx-blocks Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ. ПослС этого Π½Π°Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ любой тСкст Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠΊΠ½ΠΎ cat ΠΈ смотритС, ΠΊΠ°ΠΊ ΠΎΠ½ появляСтся. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cat Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°Π½Π°Π»Ρ‹ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки.

 1: /* mpx-blocks.с */

 2:

 3: #include <fcntl.h>

 4: #include <stdio.h>

 5: #include <unistd.h>

 6:

 7: int main(void) {

 8:  int fds[2];

 9:  char buf[4096];

10:  int i;

11:  int fd;

12:

13:  if ((fds[0] = open("p1", O_RDONLY) ) < 0) {

14:   perror("open p1");

15:   return 1;

16:  }

17:

18:  if ( (fds[1] = open("p2", O_RDONLY)) < 0) {

19:   perror("open p2");

20:   return 1;

21:  }

22:

23:  fd = 0;

24:  while (1) {

25:   /* Ссли Π΄Π°Π½Π½Ρ‹Π΅ доступны, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΡ… */

26:   i = read (fds[fd], buf, sizeof (buf) - 1);

27:   if (i < 0) {

28:    perror("read");

29:    return 1;

30:   } else if (!i) {

31:    printf("ΠΊΠ°Π½Π°Π» Π·Π°ΠΊΡ€Ρ‹Ρ‚\n");

32:    return 0;

33:   }

34:

35:   buf[i] = '\0';

36:   printf ("Ρ‡Ρ‚Π΅Π½ΠΈΠ΅: %s", buf);

37:

38:   /* Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора */

39:   fd = (fd + 1) % 2;

40:  }

41: }

Π₯отя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mpx-blocks ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ², это Π½Π΅ являСтся особо эффСктивным. Она считываСт ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ПослС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠΊΠ° Π² Π½Π΅ΠΌ доступны Π΄Π°Π½Π½Ρ‹Π΅, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» игнорируСтся Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· read() для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π²ΠΎΠ·Π²Ρ€Π°Ρ‚, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» игнорируСтся Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ чтСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³Π»Π°Π΄ΠΊΠΎΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. На рис. 13.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mpx-blocks Π²ΠΎ врСмя выполнСния.

Рис. 13.1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ запуска ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

13.1.1. НСблокируСмый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 11, Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° fcntl. Если ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ, read() сразу ΠΆΠ΅ возвращаСтся. Если Π΄Π°Π½Π½Ρ‹Π΅ нСдоступны, ΠΎΠ½Π° просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. НСблокируСмый Π²Π²ΠΎΠ΄- Π²Ρ‹Π²ΠΎΠ΄ прСдоставляСт простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, прСдотвращая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Показанная Π½ΠΈΠΆΠ΅ модифицированная вСрсия mpx-blocks ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прСимущСством Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° для Π±ΠΎΠ»Π΅Π΅ Π³Π»Π°Π΄ΠΊΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ p1 ΠΈ p2.

 1: /* mpx-nonblock.c */

 2:

 3: #include <errno.h>

 4: #include <fcntl.h>

 5: #include <stdio.h>

 6: #include <unistd.h>

 7:

 8: int main(void) {

 9:  int fds[2];

10:  char buf[4096];

11:  int i;

12:  int fd;

13:

14:  /* ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠ±Π° ΠΊΠ°Π½Π°Π»Π° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ */

15:  if ((fds[0] = open("p1", O_RDONLY | O_NONBLOCK)) < 0) {

16:   perror("open p1");

17:   return 1;

18:  }

19:

20:  if ((fds[1] = open("p2", O_RDONLY | O_NONBLOCK)) < 0) {

21:   perror("open p2");

22:   return 1;

23:  }

24:

25:  fd = 0;

26:  while (1) {

27:   /* Ссли Π΄Π°Π½Π½Ρ‹Π΅ доступны, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΡ… */

28:   i = read(fds[fd], buf, sizeof (buf) - 1);

29:   if ((i < 0) && (errno ! = EAGAIN)) {

30:    perror("read");

31:    return 1;

32:   } else if (i > 0) {

33:    buf[i] = '\0';

34:    printf("Ρ‡Ρ‚Π΅Π½ΠΈΠ΅: %s", buf);

35:   }

36:

37:   /* Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора */

38:   fd = (fd + 1) % 2;

39:  }

40: }

Π’Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ mpx-nonblock ΠΈ mpx-blocks состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mpx-nonblock Π½Π΅ закрываСтся, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° считываСт, Π·Π°ΠΊΡ€Ρ‹Ρ‚. НСблокируСмый read() ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Π±Π΅Π· Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… устройств Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π±Π°ΠΉΡ‚, ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° с Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ, Π½ΠΎ Π±Π΅Π· доступных Π΄Π°Π½Π½Ρ‹Ρ… read() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EAGAIN.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ² достаСтся высокой Ρ†Π΅Π½ΠΎΠΉ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всСгда ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскриптора для Π²Π²ΠΎΠ΄Π° β€” ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ блокируСтся. ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ приносит систСмС массу ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ опСрационная систСма Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ пСрСвСсти процСсс Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания (ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ 10 ΠΊΠΎΠΏΠΈΠΉ mpx-nonblock Π² своСй систСмС ΠΈ посмотритС, ΠΊΠ°ΠΊ это скаТСтся Π½Π° Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ).

13.1.2. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ poll()

Для эффСктивного ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Linux прСдоставляСт систСмный Π²Ρ‹Π·ΠΎΠ² poll(), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ процСссу Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов. ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎ провСряя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор, процСсс создаСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ, ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов процСсс Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π° Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ β€” Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ. Когда ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, доступныС для чтСния, ΠΈΠ»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, записываСмыС Π² Π½ΠΈΡ…, poll() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² дСскрипторах, Π½Π΅ бСспокоясь ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅. ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этих Ρ„Π°ΠΉΠ»ΠΎΠ² процСсс создаСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² poll(), Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄ΠΎ готовности Ρ„Π°ΠΉΠ»Π°. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ poll().

#include <sys/poll.h>


int poll(struct pollfd * fds, int numfds, int timeout);

ПослСдниС Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΡ‡Π΅Π½ΡŒ просты; numfds Π·Π°Π΄Π°Π΅Ρ‚ количСство элСмСнтов Π² массивС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, a timeout опрСдСляСт, насколько Π΄ΠΎΠ»Π³ΠΎ poll() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ события. Если Π² качСствС Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° задаСтся 0, poll() Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.