Udostępnij przez


Anonimowe operacje potoku

Funkcja CreatePipe tworzy anonimowy potok i zwraca dwa uchwyty: uchwyt odczytu do potoku i uchwyt zapisu w potoku. Dojście do odczytu ma dostęp tylko do odczytu do potoku, a dojście zapisu ma dostęp tylko do zapisu do potoku. Aby komunikować się przy użyciu potoku, serwer potoku musi przekazać do innego procesu uchwyt potoku. Zazwyczaj odbywa się to przez dziedziczenie; oznacza to, że proces umożliwia dziedziczenie dojścia przez proces podrzędny. Proces może również zduplikować uchwyt potoku przy użyciu funkcji DuplicateHandle i wysłać go do niepowiązanego procesu przy użyciu jakiejś formy komunikacji międzyprocesowej, takiej jak DDE lub pamięć współdzielona.

Serwer potoku może wysłać uchwyt odczytu lub uchwyt zapisu do klienta potoku, w zależności od tego, czy klient powinien używać potoku anonimowego do wysyłania informacji lub odbierania informacji. Aby odczytać z potoku, użyj uchwytu odczytu potoku w wywołaniu funkcji ReadFile. Wywołanie ReadFile jest zwracane, gdy inny proces został zapisany w potoku. Wywołanie ReadFile może również zwrócić, jeśli wszystkie dojścia zapisu do potoku zostały zamknięte lub jeśli wystąpi błąd przed ukończeniem operacji odczytu.

Aby zapisać w potoku, użyj uchwytu zapisu potoku w wywołaniu funkcji WriteFile. Wywołanie WriteFile nie zwraca się, dopóki nie zapisze określonej liczby bajtów w potoku lub wystąpi błąd. Jeśli bufor potoku jest pełny i istnieje więcej bajtów do zapisania, WriteFile nie zwraca się, dopóki inny proces nie odczytuje z potoku, co zwiększa ilość dostępnego miejsca buforu. Serwer potoku określa rozmiar buforu dla potoku, gdy wywołuje CreatePipe.

Asynchroniczne (nakładające się) operacje odczytu i zapisu nie są obsługiwane przez potoki anonimowe. Oznacza to, że nie można używać funkcji ReadFileEx i WriteFileEx z potokami anonimowymi. Ponadto parametr lpOverlappedReadFile i WriteFile jest ignorowany, gdy te funkcje są używane z potokami anonimowymi.

Potok anonimowy istnieje, dopóki wszystkie uchwyty potoku, zarówno odczyt, jak i zapis, zostały zamknięte. Proces może zamknąć uchwyty potoku przy użyciu funkcji CloseHandle. Wszystkie uchwyty potoku są również zamykane po zakończeniu procesu.

Potoki anonimowe są implementowane przy użyciu nazwanego potoku o unikatowej nazwie. W związku z tym często można przekazać uchwyt do anonimowego potoku do funkcji, która wymaga uchwytu do nazwanego potoku.