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

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

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

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ядром 4.4BSD ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ дСскриптора Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix описываСтся Π² Π³Π»Π°Π²Π΅ 18 [112].

SVR4 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ ядра для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ дСскриптора: ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ I_SENDFD ΠΈ I_RECVFD Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl, описанныС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.5.1 [110]. Но процСсс всС ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ доступа ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ свойству ядра Π·Π° счСт Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ сокСта Unix. Π’ этой ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ описываСм ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сокСтов Unix для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… дСскрипторов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ пСрСносимая тСхнология программирования: ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ с Π‘Π΅Ρ€ΠΊΠ»ΠΈ-ядрами, Ρ‚Π°ΠΊ ΠΈ с SVR4, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ I_SENDFD ΠΈ I_RECVFD Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ioctl Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² SVR4.

ВСхнология 4.4BSD позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ мноТСство дСскрипторов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendmsg, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ тСхнология SVR4 ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ дСскриптор. Π’ΠΎ всСх Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· пСрСдаСтся ΠΎΠ΄ΠΈΠ½ дСскриптор.

Π¨Π°Π³ΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ дСскриптора ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ:

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ сокСта Unix, ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ сокСта, ΠΈΠ»ΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ сокСта.

Если Ρ†Π΅Π»ΡŒΡŽ являСтся ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π» дСскриптор ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π» Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ socketpair для создания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскриптора.

Если процСссы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ родствСнными, сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix, ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‚Π΅ΠΌ самым позволяя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с этим сокСтом ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. Π—Π°Ρ‚Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос сСрвСру для открытия Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ дСскриптора, Π° сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ дСскриптор ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix. Как Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix, ΠΎΠ΄Π½Π°ΠΊΠΎ прСимущСства этого способа Π½Π΅Π²Π΅Π»ΠΈΠΊΠΈ, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ игнорирования Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹. Π”Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ сокСт ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром.

2. ΠžΠ΄ΠΈΠ½ процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ дСскриптор ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° любой ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Unix, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ дСскриптор, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ open, piΡ€Π΅, mkfifo, socket ΠΈΠ»ΠΈ accept. ΠžΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ дСскриптор любого Ρ‚ΠΈΠΏΠ°, поэтому ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ эту Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ Β«ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ дСскриптора», Π° Π½Π΅ Β«ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ дСскриптора Ρ„Π°ΠΉΠ»Π°Β».

3. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ процСсс строит структуру msghdr (см. Ρ€Π°Π·Π΄Π΅Π» 14.5), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ дСскриптор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ. Π’ POSIX ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ дСскриптор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (элСмСнт msg_control структуры msghdr, см. Ρ€Π°Π·Π΄Π΅Π» 14.6), Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ старыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ элСмСнт msg_accrights. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sendmsg для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ дСскриптора Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix, созданный Π½Π° шагС 1. На этом этапС ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ дСскриптор находится Β«Π² ΠΏΠΎΠ»Π΅Ρ‚Π΅Β». Π”Π°ΠΆΠ΅ Ссли ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ процСсс Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ дСскриптор послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendmsg, Π½ΠΎ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ процСссом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvmsg, дСскриптор останСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ для ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ процСсса. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° дСскриптора ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ счСтчик ссылок дСскриптора Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

4. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvmsg для получСния дСскриптора Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix, созданный Π½Π° шагС 1. НомСр дСскриптора Π² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌ процСссС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° дСскриптора Π² ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ процСссС. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° дСскриптора β€” это Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π½ΠΎΠΌΠ΅Ρ€Π° дСскриптора. Π­Ρ‚ΠΎΡ‚ процСсс Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора Π² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌ процСссС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° Ρ‚Ρƒ ΠΆΠ΅ запись Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ядрС, Ρ‡Ρ‚ΠΎ ΠΈ дСскриптор, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ процСссом.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ уровня прилоТСния, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ дСскриптора ΠΈΠΌΠ΅Π» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ появлСния. Если ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvmsg, Π½Π΅ Π²Ρ‹Π΄Π΅Π»ΠΈΠ² мСста Π² памяти для получСния дСскриптора, ΠΈ дСскриптор пСрСдаСтся ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ для чтСния, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ дСскриптор закрываСтся [128, с. 518]. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ установки Ρ„Π»Π°Π³Π° MSG_PEEK Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvmsg, Ссли прСдполагаСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ дСскриптора, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этом случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нСпрСдсказуСм.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскриптора

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ прСдставим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскриптора. ΠœΡ‹ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ mycat, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки пСрСдаСтся ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°. Но вмСсто Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Unix open ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_open. Π­Ρ‚Π° функция создаСт ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork ΠΈ exec для запуска Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ дСскриптор ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу ΠΏΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ.

На рис. 15.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг: наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mycat послС создания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ socketpair. ΠœΡ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ»ΠΈ Π΄Π²Π° дСскриптора, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ socketpair, ΠΊΠ°ΠΊ [0] ΠΈ [1].

Рис. 15.1. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mycat послС создания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ socketpair

Π—Π°Ρ‚Π΅ΠΌ процСсс Π²Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fork, ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exec для выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ openfile. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ дСскриптор [1], Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ дСскриптор [0]. (НСт Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° происходит Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΌΠΎΠ³ Π±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ [1], Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ β€” [0].) ΠŸΡ€ΠΈ этом получаСтся схСма, показанная Π½Π° рис. 15.2.

Рис. 15.2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mycat послС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ openfile

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

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ выполнСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для открытия Ρ„Π°ΠΉΠ»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π° счСт приравнивания ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊ привилСгиям Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΡ€Π°Π²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ситуации. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° позволяСт Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€Π°Π² доступа Unix (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅) ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π² доступа. ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ mycat, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² листингС 15.7.

Листинг 15.7. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mycat: ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°

//unixdomain/mycat.c

 1 #include "unp.h"


 2 int my_open(const char*, int);


 3 int

 4 main(int argc, char **argv)

 5 {

 6  int fd, n;

 7  char buff[BUFFSIZE];


 8  if (argc != 2)

 9   err_quit("usage: mycat <pathname>");


10  if ((fd = my_open(argv[1], O_RDONLY)) < 0)

11   err_sys("cannot open %s", argv[1]);


12  while ((n = Read(fd, buff, BUFFSIZE)) > 0)

13   Write(STDOUT_FILENO, buff, n);


14  exit(0);

15 }

Если ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_open Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open, эта простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всСго лишь скопируСт Ρ„Π°ΠΉΠ» Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°.

Ѐункция my_open, показанная Π² листингС 15.8, Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ для Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса ΠΊΠ°ΠΊ обычная функция Unix open. Она ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° β€” ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΈ Ρ€Π΅ΠΆΠΈΠΌ открытия (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, O_RDONLY ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния), ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор.

Листинг 15.8. Ѐункция my_open: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ дСскриптора

//unixdomain/myopen.c

 1 #include "unp.h"


 2 int

 3 my_open(const char *pathname, int mode)

 4 {

 5  int fd, sockfd[2], status;

 6  pid_t childpid;

 7  char c, argsockfd[10], argmode[10];


 8  Socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);


 9  if ((childpid = Fork()) == 0) { /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

10   Close(sockfd[0]);

11   snprintf(argsockfd, sizeof(argsockfd), "%d", sockfd[1]);

12   snprintf(argmode, sizeof(argmode), "%d", mode);

13   execl("./openfile", "openfile", argsockfd, pathname, argmode,

14    (char*)NULL);

15   err_sys("execl error");

16  }

17  /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс - ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса */