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

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

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

uid=1007(andy) gid=1007(andy) groups=1007(andy), 0(wheel)

Если ΠΌΡ‹ запустим сСрвСр Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ρ‚ΠΎ для сСрвСра послС ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ выполнСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ прСдставлСнный Π½ΠΈΠΆΠ΅ Π²Ρ‹Π²ΠΎΠ΄.

freebsd % unixstrserv02

PID of sender = 26881

real user ID = 1007

real group ID = 1007

effective user ID = 1007

2 groups: 1007 0

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ выводится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… сСрвСру. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ свСдСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ id.

15.9. РСзюмС

Π”ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ сокСты Unix ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ IPC, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр находятся Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ использования Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сокСтов Unix ΠΏΠ΅Ρ€Π΅Π΄ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ IPC состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ API практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрному сСтСвому соСдинСнию. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ использования Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сокСтов Unix ΠΏΠ΅Ρ€Π΅Π΄ TCP, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр находятся Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сокСтов Unix ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ TCP Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях.

ΠœΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ наш эхо-сСрвСр ΠΈ эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ TCP ΠΈ UDP для использования Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² Unix, ΠΈ СдинствСнным Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ оказалась Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя с клиСнтским сокСтом UDP Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСру UDP Π±Ρ‹Π»ΠΎ ΠΊΡƒΠ΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° дСскрипторов ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ сСрвСрами, находящимися Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, β€” это мощная тСхнология, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ сокСтами Unix. ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскриптора ΠΎΡ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.7. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 28.7 ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ родствСнными, Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 30.9 β€” Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° дСскриптор пСрСдаСтся ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ.

УпраТнСния

1. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвСр Unix Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ unlink послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind?

2. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвСр Unix ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ отсоСдинит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unlink своС извСстноС ΠΏΠΎΠ»Π½ΠΎΠ΅ имя, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с сСрвСром Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ?

3. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ листинг 11.5 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ адрСс ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° собСсСдника, Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ Π±Ρ‹ функция sleep(5), Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти число Π±Π°ΠΉΡ‚ΠΎΠ², Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ read всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ листинг 11.8 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, отправляСмого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ функция write. (ΠœΡ‹ обсуТдаСм ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ измСнСния Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ упраТнСния 1.5.) ЗапуститС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ TCP. Бколько Π±Π°ΠΉΡ‚ΠΎΠ² считываСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read?

ЗапуститС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix. ИзмСнилось Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для сСрвСра вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ send ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ Ρ„Π»Π°Π³ MSG_EOR (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ это ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ). ЗапуститС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΠ·Π»Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix. ИзмСнилось Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ?

4. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ значСния, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». 4.6. Один ΠΈΠ· ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈ Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork Ρ€Π°Π·Π²Π΅Ρ‚Π²ΠΈΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСссы. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ†ΠΈΠΊΠ» for, увСличивая Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ backlog ΠΎΡ‚ 0 Π΄ΠΎ 14. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс сначала записываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ backlog Π² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π». Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, создаСт ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт, связанный с адрСсом Π·Π°ΠΊΠΎΠ»ΡŒΡ†ΠΎΠ²ΠΊΠΈ, ΠΈ присваиваСт backlog считанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π΄Π΅Π»Π°Π΅Ρ‚ запись Π² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» просто для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу ΠΎ своСй готовности. Π—Π°Ρ‚Π΅ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс пытаСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС соСдинСний, Π·Π°Π΄Π°Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alarm Ρ€Π°Π²Π½Ρ‹ΠΌ 2 с, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ достиТСнии ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния backlog Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect заблокируСтся, ΠΈ отправляСт Π΅Ρ‰Π΅ Ρ€Π°Π· сСгмСнт SYN. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept, Ρ‡Ρ‚ΠΎ позволяСт ядру ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ всС соСдинСния с Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ процСссом. Когда истСкаСт врСмя оТидания Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alarm, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС 2 с), ΠΏΠΎ счСтчику Ρ†ΠΈΠΊΠ»Π° ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, какая ΠΏΠΎ счСту функция connect соотвСтствуСт ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ backlog. Π—Π°Ρ‚Π΅ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ свои сокСты ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. Когда Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс считываСт Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ½ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΉ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт ΠΈ создаСт Π½ΠΎΠ²Ρ‹ΠΉ, Π·Π°Π½ΠΎΠ²ΠΎ начиная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ.

5. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈ пропуск Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind Π² листингС 15.6 ΠΎΡˆΠΈΠ±ΠΊΡƒ сСрвСра.

Π“Π»Π°Π²Π° 16

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

16.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сокСты Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π° сокСтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, наш процСсс ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² «спящСС» состояниС ΠΈ ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ условиС. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокСтов, способныС Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ.

1. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read, readv, recv, recvfrom ΠΈ recvmsg. Если ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π° для Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта TCP (Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠΉ сокСт являСтся Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ) ΠΈ Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ сокСта ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚ΠΎ сокСт Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² спящСС состояниС Π½Π° Ρ‚ΠΎ врСмя, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ TCP являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈΠ· этого состояния ΠΌΡ‹ Π²Ρ‹ΠΉΠ΄Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Β«Ρ…ΠΎΡ‚ΡŒ сколько- Π½ΠΈΠ±ΡƒΠ΄ΡŒΒ» Π΄Π°Π½Π½Ρ‹Ρ…: это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ†Π΅Π»Ρ‹ΠΉ сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ… TCP. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доступно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ фиксированноС количСство Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ readn (см. листинг 3.9) ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π΅ΠΌ Ρ„Π»Π°Π³ MSG_WAITALL (см. Ρ‚Π°Π±Π». 14.1). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ UDP являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, Ρ‚ΠΎ Ссли ΠΏΡ€ΠΈΠ΅ΠΌΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта UDP пуст, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² состояниС оТидания ΠΈ находимся Π² Π½Π΅ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° UDP.

Π’ случаС Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта ΠΏΡ€ΠΈ нСвозмоТности ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π° (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… для сокСта TCP ΠΈΠ»ΠΈ цСлая Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° для сокСта UDP) Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ происходит Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ с ошибкой EWOULDBLOCK.

2. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write, writev, send, sendto, ΠΈ sendmsg. Π’ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ сокСта TCP Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.9 ΠΌΡ‹ сказали, Ρ‡Ρ‚ΠΎ ядро ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° прилоТСния Π² Π±ΡƒΡ„Π΅Ρ€ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сокСта. Если для Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта нСдостаточно мСста Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ, процСсс ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° мСсто Π½Π΅ освободится.

Π’ случаС Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта TCP ΠΏΡ€ΠΈ нСдостаткС мСста Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ происходит Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ с ошибкой EWOULDBLOCK. Если Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сокСта Π΅ΡΡ‚ΡŒ мСсто, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ количСство Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ядро смогло ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€ (это называСтся частичным ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ β€” short count).

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.9 ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ сказали, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ UDP Π½Π΅ сущСствуСт. Π―Π΄Ρ€ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ прилоТСния ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π²Π½ΠΈΠ· ΠΏΠΎ стСку, добавляя ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ UDP ΠΈ IP. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, опСрация Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ сокСтС UDP (ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ являСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ заблокируСтся.

3. ΠŸΡ€ΠΈΠ΅ΠΌ входящих соСдинСний: функция accept. Если функция accept вызываСтся для Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта ΠΈ Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС нСдоступно, процСсс пСрСводится Π² состояниС оТидания.

Если функция accept вызываСтся для Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта ΠΈ Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС нСдоступно, возвращаСтся ошибка EWOULDBLOCK.

4. Π˜Π½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ исходящих соСдинСний: функция connect для TCP. (ВспомнитС, Ρ‡Ρ‚ΠΎ функция connect ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с UDP, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ создания Β«Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎΒ» соСдинСния β€” ΠΎΠ½Π° лишь заставляСт ядро ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ IP-адрСс ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° собСсСдника.) Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.5 ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ установлСниС соСдинСния TCP Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ трСхэтапноС Ρ€ΡƒΠΊΠΎΠΏΠΎΠΆΠ°Ρ‚ΠΈΠ΅ ΠΈ Ρ‡Ρ‚ΠΎ функция connect Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сСгмСнт ACK ΠΈΠ»ΠΈ SYN. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ функция TCP connect всСгда Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° врСмя обращСния (RTT) ΠΊ сСрвСру.

Если функция connect вызываСтся для Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сокСта TCP ΠΈ соСдинСниС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСно Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, инициируСтся установлСниС соСдинСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, отправляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ трСхэтапного рукопоТатия TCP), Π½ΠΎ возвращаСтся ошибка EINPROGRESS. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта ошибка отличаСтся ΠΎΡ‚ ошибки, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… сцСнариях. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ соСдинСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° сСрвСр находится Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΡƒΠ·Π»Π΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, поэтому Π΄Π°ΠΆΠ΅ Π² случаС Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ выполнится. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 16.3.