Udostępnij przez


Dziedziczenie uchwytu potoku

Serwer potoku kontroluje, czy jego uchwyty mogą być dziedziczone w następujący sposób:

  • Funkcja CreatePipe odbiera strukturę SECURITY_ATTRIBUTES. Jeśli serwer potoku ustawia element członkowski bInheritHandle tej struktury, aby true, można dziedziczyć dojścia utworzone przez CreatePipe.
  • Serwer potoku może użyć funkcji DuplicateHandle, aby zmienić dziedziczenie uchwytu potoku. Serwer potoku może utworzyć nieinheritable duplikat dziedziczonego uchwytu potoku lub dziedziczony duplikat nieinheritable uchwyt potoku.
  • Funkcja CreateProcess umożliwia serwerowi potoku określenie, czy proces podrzędny dziedziczy wszystkie lub żadne z jego dziedziczonych dojść.

Gdy proces podrzędny dziedziczy uchwyt potoku, system umożliwia procesowi uzyskiwania dostępu do potoku. Jednak proces nadrzędny musi przekazać wartość dojścia do procesu podrzędnego. Proces nadrzędny zazwyczaj wykonuje to przez przekierowanie standardowego dojścia wyjściowego do procesu podrzędnego, jak pokazano w poniższych krokach:

  1. Wywołaj funkcję GetStdHandle, aby uzyskać bieżącą standardową obsługę danych wyjściowych; zapisz ten uchwyt, aby można było przywrócić oryginalny standardowy uchwyt wyjściowy po utworzeniu procesu podrzędnego.
  2. Wywołaj funkcję SetStdHandle, aby ustawić standardowy uchwyt wyjściowy do uchwytu zapisu w potoku. Teraz proces nadrzędny może utworzyć proces podrzędny.
  3. Wywołaj funkcję CloseHandle, aby zamknąć uchwyt zapisu w potoku. Gdy proces podrzędny dziedziczy uchwyt zapisu, proces nadrzędny nie potrzebuje już jego kopii.
  4. Wywołaj SetStdHandle, aby przywrócić oryginalny standardowy uchwyt wyjściowy.

Proces podrzędny używa funkcji GetStdHandle, aby uzyskać standardowy uchwyt wyjściowy, który jest teraz uchwytem na końcu zapisu potoku. Następnie proces podrzędny używa funkcji WriteFile do wysyłania danych wyjściowych do potoku. Gdy element podrzędny zakończy pracę z potokiem, powinien zamknąć uchwyt potoku, wywołując CloseHandle lub przez zakończenie, co automatycznie zamyka uchwyt.

Proces nadrzędny używa funkcji ReadFile do odbierania danych wejściowych z potoku. Dane są zapisywane w potoku anonimowym jako strumień bajtów. Oznacza to, że odczyt procesu nadrzędnego z potoku nie może odróżnić bajtów zapisanych w oddzielnych operacjach zapisu, chyba że zarówno procesy nadrzędne, jak i podrzędne używają protokołu wskazującego, gdzie kończy się operacja zapisu. Gdy wszystkie dojścia zapisu do potoku są zamknięte, funkcja ReadFile zwraca zero. Ważne jest, aby proces nadrzędny zamknął uchwyt na końcu zapisu potoku przed wywołaniem ReadFile. Jeśli nie zostanie to zrobione, operacja ReadFile nie może zwrócić zera, ponieważ proces nadrzędny ma otwarte dojście do końca zapisu potoku.

Procedura przekierowywania standardowego uchwytu wejściowego jest podobna do procedury przekierowywania standardowego uchwytu wyjściowego, z tą różnicą, że dojście odczytu potoku jest używane jako standardowy uchwyt wejściowy elementu podrzędnego. W takim przypadku proces nadrzędny musi upewnić się, że proces podrzędny nie dziedziczy uchwytu zapisu potoku. Jeśli nie zostanie to zrobione, operacja ReadFile wykonywana przez proces podrzędny nie może zwrócić wartości zero, ponieważ proces podrzędny ma otwarte dojście do końca zapisu potoku.

Przykładowy program, który używa potoków anonimowych do przekierowywania standardowych dojść procesu podrzędnego, zobacz Tworzenie procesu podrzędnego za pomocą przekierowanych danych wejściowych i wyjściowych.