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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 88

Автор ДТонсон Π₯Π°Ρ€Ρ‚

10.11. ΠΠ° web-сайтС находится Ρ„Π°ΠΉΠ» multisem.c, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ слоТный сСмафор, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Windows (ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ бСзопасности, ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒΡΡ процСссами, ΠΈ для Π½ΠΈΡ… прСдусмотрСны Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ оТидания), Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΉΠ» тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ TestMultiSem.c. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ сборку ΠΈ тСстированиС этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Как Π² Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ модСль ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… условий? ΠŸΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CRITICAL_SECTION? Π§Ρ‚ΠΎ здСсь выступаСт Π² Ρ€ΠΎΠ»ΠΈ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… условий?

10.12. ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ†Π΅Π»Π΅ΡΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ½Ρ†Π΅ настоящСй Π³Π»Π°Π²Ρ‹, ΡΡΡ‹Π»Π°ΡΡΡŒ Π½Π° ошибки, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ, ΠΈΠ»ΠΈ ошибки, содСрТащиСся Π² вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π΄Π΅Ρ„Π΅ΠΊΡ‚Π°ΠΌΠΈ, прСдставлСнной Π½Π° Web-сайтС.

10.13. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ со ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ Π¨ΠΌΠΈΠ΄Ρ‚Π° ΠΈ ΠŸΡŒΡΡ€Π°Π»ΠΈ "Strategies for Implementing POSIX Condition Variables in Win32" ("Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… условий POSIX Π² Win32") (см. Ρ€Π°Π·Π΄Π΅Π» "Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°"). ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° равноправия, коррСктности, сСриализации ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΊ модСлям ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… условий (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ "ΠΈΠ΄ΠΈΠΎΠΌΠ°ΠΌΠΈ" ("idioms")), Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π² настоящСй Π³Π»Π°Π²Π΅. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ сами ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ условия Π² настоящСй Π³Π»Π°Π²Π΅ Π½Π΅ ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ; вмСсто этого эмулируСтся ΠΈΡ… использованиС, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π¨ΠΌΠΈΠ΄Ρ‚ ΠΈ ΠŸΡŒΡΡ€Π°Π»ΠΈ ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ условий, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ контСкстС.

10.14. ΠΠ°Ρ…одящиСся Π½Π° web-сайтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ batons ΠΈ batonsmultipleevents Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ сСриализации выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². О прСдпосылках ΠΈ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² говорится Π² коммСнтариях, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ связываСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ событиС, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹Π΅ состояния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π±Ρ€Π°Π½ язык C++, Ρ‡Ρ‚ΠΎ Π΄Π°Π»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ срСдствами стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ шаблонов C++ (Standard Template Library, STL). ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΈ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой эти Π΄Π²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… Π² качСствС срСдства ознакомлСния с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ STL. 

ГЛАВА 11

ВзаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами

Π’ Π³Π»Π°Π²Π΅ 6 Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ процСссы ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π³Π»Π°Π²Ρ‹ 7β€”10 Π±Ρ‹Π»ΠΈ посвящСны описанию ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² управлСния ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСссов, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΈΡ… ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ. ВмСстС с Ρ‚Π΅ΠΌ, Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ использования раздСляСмой памяти, ΠΌΡ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ рассмотрСли Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами.

НиТС Π²Ρ‹ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ мСТпроцСссным взаимодСйствиСм (Interprocess Communication, IPC)[30], Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°ΠΌ. Двумя основными ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ Windows, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ IPC, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΆΠ΅ извСстных Π²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ReadFile ΠΈ WriteFile. ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² полудуплСксном Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π­Ρ‚ΠΈ свойства Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΡ… ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ для пСрСнаправлСния Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠ°ΠΊ это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ дСлаСтся Π² UNIX. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ дСмонстрируСтся, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ возмоТности ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ³Π°Ρ‡Π΅. Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ дуплСксными, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° ΠΎΠ±ΠΌΠ΅Π½ сообщСниями ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ взаимодСйствиС Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ΄ΠΈΠ½ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… дСскрипторов. Π’ сочСтании с ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ функциями эти возмоТности Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌΠΈ для создания ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных систСм. Π­Ρ‚ΠΎ дСмонстрируСтся Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² настоящСй Π³Π»Π°Π²Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрный ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ процСссор, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π² соотвСтствии с рис. 7.1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ привлСкался для обсуТдСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² сСрвСра управляСт взаимодСйствиСм с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ "ΠΏΠΎΡ‚ΠΎΠΊ/ΠΊΠ»ΠΈΠ΅Π½Ρ‚" ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ дСскриптор, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°.

НаконСц, ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ ящики ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ рассылку сообщСний ΠΏΠΎ схСмС "ΠΎΠ΄ΠΈΠ½ ΠΌΠ½ΠΎΠ³ΠΈΠΌ", Π° ΠΈΡ… использованиС для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ возмоТностСй ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ процСссора дСмонстрируСтся Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

АнонимныС ΠΊΠ°Π½Π°Π»Ρ‹

АнонимныС ΠΊΠ°Π½Π°Π»Ρ‹ (anonymous channels) Windows ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ (полудуплСксноС) посимвольноС мСТпроцСссноС взаимодСйствиС. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° дСскриптора: дСскриптор чтСния (read handle) ΠΈ дСскриптор записи (write handle). Ѐункция, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

BOOL CreatePipe(PHANDLE phRead, PHANDLE phWrite, LPSECURITY_ATTRIBUTES lpsa, DWORD cbPipe)

ДСскрипторы ΠΊΠ°Π½Π°Π»ΠΎΠ² часто Π±Ρ‹Π²Π°ΡŽΡ‚ наслСдуСмыми; ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ этого станут понятными ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cbPipe, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π° Π² Π±Π°ΠΉΡ‚Π°Ρ…, носит Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ 0 соотвСтствуСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для IPC, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ процСсс, ΠΈ для этого процСсса трСбуСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· дСскрипторов ΠΊΠ°Π½Π°Π»Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreatePipe, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вывСсти Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ процСссу. Π’ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ процСссу дСскриптор чтСния (phRead). Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс осущСствляСт это, устанавливая дСскриптор стандартного Π²Π²ΠΎΠ΄Π° Π² структурС STARTUPINFO для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ€Π°Π²Π½Ρ‹ΠΌ *phRead.

Π§Ρ‚Π΅Π½ΠΈΠ΅ с использованиСм дСскриптора чтСния ΠΊΠ°Π½Π°Π»Π° блокируСтся, Ссли ΠΊΠ°Π½Π°Π» пуст. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π² процСссС чтСния Π±ΡƒΠ΄Π΅Ρ‚ воспринято ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°ΠΉΡ‚ΠΎΠ², сколько имССтся Π² ΠΊΠ°Π½Π°Π»Π΅, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ количСства, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReadFile. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ записи Π² Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», которая выполняСтся с использованиСм Π±ΡƒΡ„Π΅Ρ€Π° Π² памяти, Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π°.

НаконСц, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ взаимодСйствиС. Для двухстороннСго взаимодСйствия Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π΄Π²Π° ΠΊΠ°Π½Π°Π»Π°. 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° с использованиСм Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 11.1 прСдставлСн Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π΄Π²Π° процСсса ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ соСдиняСт ΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠΌ. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс устанавливаСт ΠΊΠ°Π½Π°Π» ΠΈ осущСствляСт ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ стандартного Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ задаСтся свойство наслСдования дСскрипторов Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΈ ΠΊΠ°ΠΊ организуСтся ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ стандартного Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° Π΄Π²Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСсса; эти ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ описаны Π² Π³Π»Π°Π²Π΅ 6.

ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° WriteFile Π² Π±Π»ΠΎΠΊΠ΅ Program2 Π½Π° рис. 11.1 справа ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считываСт большой объСм Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, ΠΈ лишь послС этого записываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π­Ρ‚Ρƒ запись ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°, выводя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ считывания.

Рис. 11.1. ΠœΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½ΠΎΠ΅ взаимодСйствиС с использованиСм Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°


ДСскрипторы ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΆΠ΅ возмоТности. На рис. 11.1 Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ дСскрипторов Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ это дСлаСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 11.1. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ дСскриптор устройства стандартного Π²Ρ‹Π²ΠΎΠ΄Π° сразу ΠΆΠ΅ послС создания ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠΉ процСсс ΠΌΠΎΠ³ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ процСсса. Π’ случаС сущСствования ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ дСскриптора ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ процСсса Π²Ρ‚ΠΎΡ€ΠΎΠΉ процСсс Π½Π΅ смог Π±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ систСма Π½Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ»Π° Π±Ρ‹ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 11.1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ синтаксис: Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ символом =, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠ°Π½Π°Π». ИспользованиС для этой Ρ†Π΅Π»ΠΈ символа Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹ (|) ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ возникновСнию ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с систСмным ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΌ процСссором. Рисунок 11.1 являСтся схСматичСским прСдставлСниСм выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ pipe Program1 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ = Program2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

ΠŸΡ€ΠΈ использовании срСдств ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ процСссора UNIX ΠΈΠ»ΠΈ Windows ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠΌΠ΅Π»Π° Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

$ Program1 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ | Program2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 11.1. pipe: мСТпроцСссноС взаимодСйствиС с использованиСм Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² 

#include "EvryThng.h"

int _tmain(int argc, LPTSTR argv[])

/* Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Π½Π°Π»Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС: pipe ΠΊΠΎΠΌΠ°Π½Π΄Π°1 = ΠΊΠΎΠΌΠ°Π½Π΄Π°2 */

{

 DWORD i = 0;

 HANDLE hReadPipe, hWritePipe;

 TCHAR Command1[MAX_PATH];

 SECURITY_ATTRIBUTES PipeSA = /* Для наслСдуСмых дСскрипторов. */

  {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

 PROCESS_INFORMATION ProcInfo1, ProcInfo2;

 STARTUPINFO StartInfoCh1, StartInfoCh2;

 LPTSTR targv = SkipArg(GetCommandLine());

 GetStartupInfo(&StartInfoCh1);

 GetStartupInfo(&StartInfoCh2);

 /* Найти символ "=", Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. */

 while (*targv != '=' && *targv != '\0') {

  Command1[i] = *targv;