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

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

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

ΠŸΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях дСскриптор становится Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ?

ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ готовности дСскриптора для Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (чтСния ΠΈΠ»ΠΈ записи) ΠΈΠ»ΠΈ возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (внСполосныС Π΄Π°Π½Π½Ρ‹Π΅). Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΈ записи ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° для Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов, Π² случаС дСскрипторов сокСтов слСдуСт Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция select сообщаСт, Ρ‡Ρ‚ΠΎ сокСт Π³ΠΎΡ‚ΠΎΠ² (см. рис. 16.52 [128]).

1. Π‘ΠΎΠΊΠ΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² для чтСния, Ссли Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

 1) Ρ‡ΠΈΡΠ»ΠΎ Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ сокСта большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… (low water-mark) для ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° сокСта. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ считывания Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· сокСта Π½Π΅ блокируСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, большСС нуля (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ для чтСния). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… (low-water mark) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SO_RCVLOWAT. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для сокСтов TCP ΠΈ UDP это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 1;

 2) Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ соСдинСниС закрываСтся (Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ сСгмСнт FIN). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ считывания Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· сокСта Π½Π΅ блокируСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π½ΡƒΠ»ΡŒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°);

 3) ΡΠΎΠΊΠ΅Ρ‚ являСтся ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ, ΠΈ число установлСнных соСдинСний Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅. Ѐункция accept Π½Π° ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠΌ сокСтС Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ блокируСтся, хотя Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 16.6 ΠΌΡ‹ описываСм ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ функция accept ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсмотря Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ установлСнных соСдинСний;

 4) ΠΎΡˆΠΈΠ±ΠΊΠ° сокСта, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ чтСния Π½Π° сокСтС Π½Π΅ блокируСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ (-1) со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ условиС ошибки. Π­Ρ‚ΠΈ ошибки, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getsockopt с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ SO_ERROR, послС Ρ‡Π΅Π³ΠΎ состояниС ошибки Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ.

2. Π‘ΠΎΠΊΠ΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² для записи, Ссли Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

 1) ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±Π°ΠΉΡ‚ΠΎΠ² доступного пространства Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сокСта большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… для Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сокСта ΠΈ Π»ΠΈΠ±ΠΎ сокСт являСтся присоСдинСнным, Π»ΠΈΠ±ΠΎ сокСту Π½Π΅ трСбуСтся соСдинСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сокСт UDP). Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для сокСта (см. Π³Π»Π°Π²Ρƒ 16), опСрация записи Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ процСсс ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, число Π±Π°ΠΉΡ‚ΠΎΠ², принятых транспортным ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ). Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ минимальноС количСство Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SO_SNDLOWAT. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 2048 для сокСтов TCP ΠΈ UDP;

 2) ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ записи Π² сокСт сгСнСрируСт сигнал SIGPIPE (см. Ρ€Π°Π·Π΄Π΅Π» 5.12);

 3) ΠΎΡˆΠΈΠ±ΠΊΠ° сокСта, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ записи Π² сокСт Π½Π΅ блокируСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ (-1) со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ условиС ошибки. Π­Ρ‚ΠΈ ошибки, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getsockopt с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ сокСта SO_ERROR.

3. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π° сокСтС Π² Ρ‚ΠΎΠΌ случаС, Ссли приняты внСполосныС Π΄Π°Π½Π½Ρ‹Π΅ Π»ΠΈΠ±ΠΎ Ссли ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π²Π½Π΅- полосных Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΅Ρ‰Π΅ Π½Π΅ достигнута. (ВнСполосныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 24.)

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

Наши опрСдСлСния Β«Π³ΠΎΡ‚ΠΎΠ² для чтСния» ΠΈ Β«Π³ΠΎΡ‚ΠΎΠ² для записи» взяты нСпосрСдствСнно ΠΈΠ· ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ядра soreadable ΠΈ sowritable (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² [128, с. 530-531]). Аналогично, нашС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Β«ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации» взято ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ soo_select, которая описана Ρ‚Π°ΠΌ ΠΆΠ΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° происходит ошибка Π½Π° сокСтС, функция select ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π΅Π³ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠ°ΠΊ для чтСния, Ρ‚Π°ΠΊ ΠΈ для записи.

ЗначСния минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… (low-water mark) для ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, сколько Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ доступно для чтСния ΠΈΠ»ΠΈ сколько мСста Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ доступно для записи ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ функция select сообщит, Ρ‡Ρ‚ΠΎ сокСт Π³ΠΎΡ‚ΠΎΠ² для чтСния ΠΈΠ»ΠΈ записи. НапримСр, Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 64 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π²Π½Ρ‹ΠΌ 64, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция select Π½Π΅ Π²Ρ‹Π²Π΅Π»Π° нас ΠΈΠ· состояния оТидания, Ссли для чтСния Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΌΠ΅Π½Π΅Π΅ 64 Π±Π°ΠΉΡ‚.

Пока Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ минимального количСства Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² сокСтС UDP мСньшС, Ρ‡Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сокСта (Π° Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ всСгда устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), сокСт UDP всСгда Π³ΠΎΡ‚ΠΎΠ² для записи, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ соСдинСния Π½Π΅ трСбуСтся.

Π’ Ρ‚Π°Π±Π». 6.1 ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ описанныС Π²Ρ‹ΡˆΠ΅ условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сокСт становится Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select.


Π’Π°Π±Π»ΠΈΡ†Π° 6.1. Условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция select сообщаСт, Ρ‡Ρ‚ΠΎ сокСт Π³ΠΎΡ‚ΠΎΠ² для чтСния ΠΈΠ»ΠΈ для записи Π»ΠΈΠ±ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации

УсловиС Π‘ΠΎΠΊΠ΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² для чтСния Π‘ΠΎΠΊΠ΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² для записи Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация Π”Π°Π½Π½Ρ‹Π΅ для чтСния β€’ Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° соСдинСния Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° β€’ Для ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ сокСта Π³ΠΎΡ‚ΠΎΠ²ΠΎ Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС β€’ ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ, доступноС для записи β€’ Π—Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° соСдинСния Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° β€’ Ошибка, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ β€’ β€’ ВнСполосныС Π΄Π°Π½Π½Ρ‹Π΅ TCP β€’

МаксимальноС число дСскрипторов для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select

Π Π°Π½Π΅Π΅ ΠΌΡ‹ сказали, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ дСскрипторов. НапримСр, Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ сотни дСскрипторов. Но Ρ‚Π°ΠΊΠΈΠ΅ прилоТСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΈ часто ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select для ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ дСскрипторов. Когда функция select Π±Ρ‹Π»Π° создана, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° максимальноС число дСскрипторов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса (этот ΠΏΡ€Π΅Π΄Π΅Π» Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ 4.2BSD составлял 31), ΠΈ функция select просто использовала Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€Π΅Π΄Π΅Π». Но соврСмСнныС вСрсии Unix Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ число дСскрипторов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса (часто ΠΎΠ½ΠΎ ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСством памяти ΠΈ административными ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ), поэтому Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция select?

МногиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ объявлСния, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ взято ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° 4.4BSD <sys/types.h>:

/*

  Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FD_SETSIZE ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ,

  Π½ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ здСсь ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

  являСтся достаточным Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв.

*/


#ifndef FD_SETSIZE

#define FD_SETSIZE 256

#endif

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого коммСнтария, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ этого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ FD_SETSIZE Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ 256, Ρ‚ΠΎ увСличится Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Π±ΠΎΡ€ΠΎΠ² дСскрипторов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ select. К соТалСнию, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π½Π΅ дСйствуСт.

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π² Ρ‡Π΅ΠΌ Π΄Π΅Π»ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° рис. 16.53 [128] ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Π½Π°Π±ΠΎΡ€Π° дСскрипторов Π²Π½ΡƒΡ‚Ρ€ΠΈ ядра, Π° Π² качСствС Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² ядрС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FD_SETSIZE. ЕдинствСнный способ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Π±ΠΎΡ€ΠΎΠ² дСскрипторов β€” это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FD_SETSIZE ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ядро. ИзмСнСния значСния Π±Π΅Π· пСрСкомпиляции ядра нСдостаточно.

НСкоторыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ свои Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ процСссу Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FD_SETSIZE, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. BSD/OS Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ядра, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ большиС Π½Π°Π±ΠΎΡ€Ρ‹ дСскрипторов, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅ΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠ²Ρ‹Ρ… макроопрСдСлСния FD_xxx для динамичСского размСщСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² дСскрипторов Π² памяти ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ. Однако с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния пСрСносимости Π½Π΅ стоит Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ использованиСм Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² дСскрипторов.

6.4. Ѐункция str_cli (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ str_cli, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.5 (Π½Π° этот Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select), Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ процСсс сСрвСра. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсиСй состояла Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс ΠΌΠΎΠ³ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fgets, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходило Π½Π° сокСтС. Наша новая вСрсия этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСсто этого блокируСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, оТидая готовности для чтСния Π»ΠΈΠ±ΠΎ стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°, Π»ΠΈΠ±ΠΎ сокСта. На рис. 6.7 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ условия, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select.