Komunikacja między procesami
description
Transcript of Komunikacja między procesami
Jest to sposób komunikacji między procesami. Polega na współdzieleniu pamięci. Proces który tworzy pipe jest serwerem a proces łączący się z nim to klient.
Wyróżniamy dwa typy potoków, nazwane i anonimowe.
Zawsze wykorzystywane lokalnie, nie w komunikacji sieciowej.
Tworzymy za pomocą funkcji CreatePipe
Po wywołaniu funkcji dostajemy uchwyty do zapisu i odczytu, póki one nie zostaną zamknięte (CloseHandle) potok będzie istniał (chyba, że działanie procesu zostanie zakończone.
By zapisywać i odczytywać dane z potoku wykorzystujemy funkcje WriteFile i ReadFile.
Wykorzystują one uchwyty które otrzymujemy po wykonaniu CreatePipe.
Funkcja tworzy potok nienazwany. Taki pipe można używać w ramach jednego procesu.
BOOL CreatePipe( PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES
lpPipeAttributes,DWORD nSize)
Funkcja tworzy potok nazwany. Można go wykorzystywać do komunikacji między procesami.
HANDLE CreateNamedPipe( LPCTSTR lpName, DWORD dwOpenMode,DWORD dwPipeMode,DWORD nMaxInstances,DWORD nOutBufferSize,DWORD nInBufferSize,DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
lpName – nazwa potoku, która musi mieć
postać: \\.\pipe\nazw
dwOpenMode – tryb dostępu do potoku- PIPE_ACCESS_DUPLEX – zapis i odczyt, - PIPE_ACCESS_INBOUND – od klienta do
serwera, - PIPE_ACCESS_OUTBOUND – od serwera
do klienta, oraz dodatkowe flagi: - FILE_FLAG_WRITE_THROUGH – bez
buforowania; istotne tylko przy komunikacji przez sieć, - FILE_FLAG_OVERLAPPED – tryb
overlapped (asynchroniczny
dwPipeMode – tryb pracy potoku,sposób zapisu:- PIPE_TYPE_BYTE – zapis do potoku binarny- PIPE_TYPE_MESSAGE – zapis tekstowy (tylko w trybie overlapped!) sposób odczytu:- PIPE_READMODE_BYTE – odczyt z potoku
binarny- PIPE_READMODE_MESSAGE – odczyt tekstowy (tylko przy zapisie tekstowym!)oraz blokowanie I/O:- PIPE_WAIT – potok blokujący- PIPE_NOWAIT – potok nieblokujący (kompatybilność wstecz, niezalecane
Przykład:HANDLE Pipe;Pipe = CreateNamedPipe ( "\\\\.\\pipe\\TestowyPipe",PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE | PIPE_WAIT,1, 2048, 2048, 1000,NULL);
Funkcja czeka aż klient zostanie połączony ze stworzonym wcześniej potokiem nazwanym.
BOOL ConnectNamedPipe( HANDLE hNamedPipe,LPOVERLAPPED lpOverlapped);
Przykład: ConnectNamedPipe (Pipe, NULL)
Rozłącza potok od strony serwera.
BOOL DisconnectNamedPipe( HANDLE hNamedPipe,);
http://msdn.microsoft.com/en-us/library/aa365780(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/aa365799(v=vs.85).aspx