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

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

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

2. Π‘уфСризация ΠΏΠΎ строкам (line buffered) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° встрСчаСтся символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fflush ΠΈΠ»ΠΈ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit.

3. ΠžΡ‚сутствиС Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (unbuffered) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° вызываСтся функция стандартного Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Unix стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°:

β–  Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ошибок Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ буфСризуСтся.

β–  Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ устройству, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ строкам.

β–  Π’сС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρƒ, Π² случаС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎ строкам.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сокСт Π½Π΅ являСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ устройством, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, отмСчСнная с нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ str_echo Π² листингС 14.6, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° (fpot) ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½. Π•ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ строкам ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setvbuf Π»ΠΈΠ±ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π½ΡƒΡŽ строку Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fflush послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fputs. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ любого ΠΈΠ· этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ скоррСктируСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_echo. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ‡Ρ€Π΅Π²Π°Ρ‚Ρ‹ ошибками ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ»ΠΎΡ…ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Нагла. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ использования стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° для сокСтов ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΡƒΡ„Π΅Ρ€Π°ΠΌΠΈ, Π° Π½Π΅ со строками (см. Ρ€Π°Π·Π΄Π΅Π» 3.9). ИспользованиС стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ затруднСния.

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

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° всС Π΅Ρ‰Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с дСскрипторами, большими 255. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ с сСтСвыми сСрвСрами, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ мноТСство дСскрипторов. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры FILE Π² вашСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <stdio.h>, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… относится дСскриптор.

14.9. Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ опрос

Π’ Π½Π°Ρ‡Π°Π»Π΅ этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ рассказывали ΠΎ способах установки Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с сокСтами. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах для этого ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ poll ΠΈ select, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ описаны Π² Π³Π»Π°Π²Π΅ 6. Ни ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΅Ρ‰Π΅ Π½Π΅ стандартизован POSIX, поэтому ΠΌΠ΅ΠΆΠ΄Ρƒ рСализациями ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ различия. Код, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ нСпСрСносимым. ΠœΡ‹ рассмотрим Π΄Π²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ вСсьма ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Π½ΠΈΡ….

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ /dev/poll

Π’ Solaris имССтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» /dev/poll, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ большСС количСство дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° select ΠΈ poll состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ список дСскрипторов приходится ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅. Устройство опроса ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ список ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… опросу дСскрипторов, Π° ΠΏΠΎΡ‚ΠΎΠΌ спокойно Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‚ΡŒΡΡ Π² опросС ΠΈ Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ список ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.

ПослС открытия /dev/poll ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив структур pollfd (Ρ‚Π΅Ρ… ΠΆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ poll, Π½ΠΎ Π² этом случаС ΠΏΠΎΠ»Π΅ revents Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ). Π—Π°Ρ‚Π΅ΠΌ массив пСрСдаСтся ядру Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ write (структура записываСтся нСпосрСдствСнно Π² /dev/poll). ПослС этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ioctl DP_POLL ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ событий. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ioctl пСрСдаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ структура:

struct dvpoll {

 struct pollfd* dp_fds;

 int            dp_nfds;

 int            dp_timeout;

};

ПолС dp_fds ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π±ΡƒΡ„Π΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для хранСния массива структур pollfd, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ioctl. ПолС dp_nfds Π·Π°Π΄Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°. Π’Ρ‹Π·ΠΎΠ² ioctl блокируСтся Π΄ΠΎ появлСния ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ событий Π½Π° любом ΠΈΠ· ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… дСскрипторов, ΠΈΠ»ΠΈ Π΄ΠΎ прохоТдСния dp_timeout миллисСкунд. ΠŸΡ€ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° функция ioctl возвращаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ способ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… сокСтов). Π’Π°ΠΉΠΌ-Π°ΡƒΡ‚, Ρ€Π°Π²Π½Ρ‹ΠΉ -1, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.

Π˜Π·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_cli, пСрСписанной ΠΈΠ· листинга 6.2 с использованиСм /dev/poll, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 14.7.

Листинг 14.7. Ѐункция str_cli, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ /dev/poll

//advio/str_cli_poll03.c

 1 #include "unp.h"

 2 #include <sys/devpoll.h>


 3 void

 4 str_cli(FILE *fp, int sockfd)

 5 {

 6  int stdineof;

 7  char buf[MAXLINE];

 8  int n;

 9  int wfd;

10  struct pollfd pollfd[2];

11  struct dvpoll dopoll;

12  int i;

13  int result;


14  wfd = Open("/dev/poll", O_RDWR, 0);


15  pollfd[0].fd = fileno(fp);

16  pollfd[0].events = POLLIN;

17  pollfd[0].revents = 0;


18  pollfd[1].fd = sockfd;

19  pollfd[1].events = POLLIN;

20  pollfd[1].revents = 0;


21  Write(wfd, pollfd, sizeof(struct pollfd) * 2);


22  stdineof = 0;

23  for (;;) {

24   /* Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎ готовности сокСта */

25   dopoll.dp_timeout = -1;

26   dopoll.dp_nfds = 2;

27   dopoll.dp_fds = pollfd;

28   result = Ioctl(wfd, DP_POLL, &dopoll);


29   /* Ρ†ΠΈΠΊΠ» ΠΏΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ дСскрипторам */

30   for (i = 0; i < result; i++) {

31    if (dopoll.dp_fds[i].fd == sockfd) {

32     /* сокСт Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ */

33     if ((n = Read(sockfd, buf, MAXLINE)) == 0) {

34      if (stdineof == 1)

35       return; /* Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ */

36      else

37       err_quit("str_cli: server terminated prematurely");

38     }


39     Write(fileno(stdout), buf, n);

40    } else {

41     /* дСскриптор Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ */

42     if ((n = Read(fileno(fp), buf, MAXLINE)) == 0) {

43      stdineof = 1;

44      Shutdown(sockfd, SHUT_WR); /* ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° FIN */

45      continue;

46     }


47     Writen(sockfd, buf, n);

48    }

49   }

50  }

51 }

БоставлСниС списка дСскрипторов для /dev/poll

14-21 Π—Π°ΠΏΠΎΠ»Π½ΠΈΠ² массив структур pollfd, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ Π² /dev/poll. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскриптора, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΈΡ… Π² статичСский массив. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ /dev/poll, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ слСдят Π·Π° сотнями ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ тысячами дСскрипторов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, поэтому массив выдСляСтся динамичСски.

ОТиданиС Π΄Π°Π½Π½Ρ‹Ρ…

24-28 ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ select, Π° блокируСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ioctl Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ поступлСния Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт собой количСство Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ².

Π¦ΠΈΠΊΠ» ΠΏΠΎ дСскрипторам

30-49 ΠΠ°ΡˆΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ проста, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ дСскрипторов всСго Π΄Π²Π°. Π’ большой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ слоТным. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ дСскрипторам.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ kqueue

БистСма FreeBSD вСрсии 4.1 ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»Π° сСтСвым программистам Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ kqueue. Π­Ρ‚ΠΎΡ‚ интСрфСйс позволяСт процСссу Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ событий, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ процСсс события kqueue. К событиям этого Ρ‚ΠΈΠΏΠ° относятся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ асинхронный Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄, ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов.

#include <sys/types.h>

#include <sys/event.h>

#include <sys/time.h>


int kqueue(void);

int kevent(int kq, const struct kevent *changelist, int nchanges,

 struct kevent *eventlist, int nevents, const struct timespec *timeout);

void EV_SET(struct kevent *kev, uintptr_t ident, short filter,

 u_short flags, u_int fflags, intptr_t data, void *udata);

Ѐункция kqueue Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор kqueue, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… kevent. Ѐункция kevent примСняСтся для рСгистрации ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… событий, Π° Ρ‚Π°ΠΊΠΆΠ΅ для получСния ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ± этих событиях. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ changelist ΠΈ nchanges ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ измСнСния Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ списка событий. Если nchanges ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ нуля, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ Π² структурС changelist измСнСния. Ѐункция kevent Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство событий ΠΈΠ»ΠΈ Π½ΡƒΠ»ΡŒ, Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π²Ρ‹Ρ…ΠΎΠ΄ ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ. Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ timeout хранится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ select (NULL для блокирования, Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для задания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌ- Π°ΡƒΡ‚Π°, Π° Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трактуСтся ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ timeout ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ struct timespec, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ struct timeval Π² Π²Ρ‹Π·ΠΎΠ²Π΅ select Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ наносСкундноС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” микросСкундноС.