130 likes | 265 Views
Komunikacja między procesami. Pipes. 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. Potoki anonimowe.
E N D
Pipes • 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.
Potoki 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.
Potoki anonimowe c.d. • By zapisywać i odczytywać dane z potoku wykorzystujemy funkcje WriteFile i ReadFile. • Wykorzystują one uchwyty które otrzymujemy po wykonaniu CreatePipe.
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 )
CreateNamedPipe() 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_ATTRIBUTESlpSecurityAttributes )
CreateNamedPipe() c.d. lpName – nazwa potoku, która musi mieć postać: \\.\pipe\nazw
CreateNamedPipe() c.d. 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
CreateNamedPipe() c.d. 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
CreateNamedPipe() c.d. Przykład: HANDLE Pipe; Pipe = CreateNamedPipe ( "\\\\.\\pipe\\TestowyPipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, 1, 2048, 2048, 1000, NULL);
ConnectNamedPipe() Funkcja czeka aż klient zostanie połączony ze stworzonym wcześniej potokiem nazwanym. BOOL ConnectNamedPipe( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped ); Przykład: ConnectNamedPipe (Pipe, NULL)
DisconnectNamedPipe() Rozłącza potok od strony serwera. BOOL DisconnectNamedPipe( HANDLE hNamedPipe, );
Linki • http://msdn.microsoft.com/en-us/library/aa365780(v=vs.85).aspx • http://msdn.microsoft.com/en-us/library/aa365799(v=vs.85).aspx