KNOW INTUIT, Лекция, Междупроцесен обмен

Организация на каналите в ОС Windows

Анонимни канали

Анонимните канали в Windows са полудуплексно средство за поточно предаване на байтове между братски процеси. Те работят в локалната компютърна система и са много подходящи за пренасочване на изхода на една програма към входа на друга. Анонимните канали се реализират с помощта на именувани канали с уникални имена.

Анонимните канали се създават от сървърния процес с помощта на функцията CreatePipe:

Функцията CreatePipe връща два дескриптора (ръкохватки) за четене и запис в канала. След като каналът е създаден, тези манипулатори (или един от тях) трябва да бъдат предадени на клиентския процес, което обикновено се прави с помощта на механизма за наследяване.

Наследяването на дескриптор изисква дъщерният процес да бъде създаден от функцията CreateProcess с флага за наследяване TRUE. Първо трябва да създадете наследени дескриптори. Това може да се направи, например, чрез изрично указване на параметъра bInheritHandle на структурата SECURITY_ATTRIBUTES, когато каналът е създаден.

Друг начин е да създадете наследен дубликат на съществуващ манипулатор с помощта на функцията DuplicateHandle и след това да го предадете на създадения процес чрез командния ред или по друг начин.

След като получи желания манипулатор, клиентският процес, подобно на сървъра, може допълнително да взаимодейства с канала, използвайки функциите ReadFile и WriteFile. Когато приключите с канала, и двата процеса трябва да затворят манипулаторите с функцията CloseHandle.

Изпълнение на програма за комуникация на процеса през анонимен канал със себе си

В горната програма се създава анонимен канал, в него се записва низ от числа, след което част от този низ се чете и показва на екрана.

Изпълнение на чат програма през анонимен клиентски и сървърен канал

Като самостоятелно упражнение се препоръчва да се организира комуникация между процесите чрез анонимен канал. Сървърният процес трябва да създаде канал, да запише информация в него и да стартира клиентския процес, чиято задача е да извлече записаната информация от канала.

Именувани тръби

Наименуваните канали са обекти на ядрото на операционната система Windows, които позволяват организиране на междупроцесна комуникация не само в изолирана компютърна система, но и в локална мрежа. Те осигуряват пълна дуплексна комуникация и позволяват както стрийминг модел, така и модел, ориентиран към съобщения. Обменът на данни може да бъде синхронен и асинхронен.

Имената на създадените именувани канали могат да бъдат изброени с помощта на безплатната помощна програма pipelist от http://www.sysinternals.com. Тъй като имената на канали са интегрирани в обща структура за именуване на обекти, приложенията могат да отварят именувани канали с помощта на функцията CreateFile и да взаимодействат с тях с помощта на функциите ReadFile и WriteFile.

Използване на именувани канали

Сървърът създава именуван канал с помощта на функцията CreateNamedPipe (вижте MSDN).

В допълнение към името на канала във формата, описана по-горе, функционалните параметри включват: флаг, указващ модела на трансфер на данни; параметър, който определя дали каналът трябва да бъде синхронен или асинхронен и дали каналът трябва да бъде еднопосочен или двупосочен. Освен това има незадължителен дескриптор за сигурност, който предотвратява неоторизиран достъп до наименуваната тръба, и настройка, която определя максималния брой едновременни връзки на тази тръба.

Чрез многократно извикване на CreateNamedPipe можете да създадете допълнителни екземпляри на същотоканал.

След извикването CreateNamedPipe, сървърът прави извикване на ConnectNamedPipe и чака отговор от клиенти, които се свързват към канала с помощта на функцията CreateFile или CallNamedPipe, като посочва името на създадения от сървъра канал, когато се обаждат. Правният клиент получава манипулатор, който представлява клиентската страна на наименования канал и функцията на сървъра ConnectNamedPipe завършва.

След като се установи наименована канална връзка, клиентът и сървърът могат да я използват за четене и запис на данни чрез функциите Win32 ReadFile и WriteFile.

Изпълнение на програма за комуникация на два процеса чрез наименуван канал

Като упражнение се препоръчва да стартирате комуникационна програма клиент-сървър през наименуван канал.

В този пример сървърът създава канал, след което стартира процеса на клиента и чака връзка. След това прочита съобщението, изпратено от клиента.

В допълнение към изброените по-горе, системата предоставя редица полезни функции за работа с именувани канали. За да копирате данни от наименуван канал, без да го премахвате от канала, използвайте функцията PeekNamedPipe. Функцията TransactNamedPipe се използва за комбиниране на четене и запис в канал в една операция, наречена транзакция. Има информационни функции за определяне на състоянието на тръба, като GetNamedPipeHandleState или GetNamedPipeInfo. Пълният списък е в MSDN.

Заключение

Организацията на съвместните дейности и комуникацията на процесите е важна и неотложна задача. Основните методи за междупроцесен обмен традиционно включват канали и споделена памет, за чиято организация се използват споделени ресурси. Анонимните канали поддържат стрийминг модел, в който са даннитенеструктурирана последователност от байтове. Наименуваните канали, които поддържат както модела с нишки, така и модела, ориентиран към съобщения, осигуряват комуникация не само в изолирана компютърна среда, но и в локална мрежа.