Udostępnij za pośrednictwem


Dziedziczenie

Proces podrzędny może dziedziczyć kilka właściwości i zasobów z procesu nadrzędnego. Można również uniemożliwić procesowi podrzędnemu dziedziczenie właściwości z procesu nadrzędnego. Następujące elementy można dziedziczyć:

  • Otwarte dojścia zwrócone przez funkcję CreateFile. Obejmuje to dojścia do plików, wejściowych konsoli, ekranu konsoli, nazwanych potoków, urządzeń komunikacji szeregowej ilotów poczty.
  • Otwarte dojścia do przetwarzania, wątku, mutexu, zdarzenia, semafora, nazwanego potoku, potoku anonimowego i obiektów mapowania plików. Są one zwracane przez CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore , createNamedPipe, CreatePipei createFileMapping funkcji.
  • Zmienne środowiskowe.
  • Bieżący katalog.
  • Konsola, chyba że proces zostanie odłączony lub zostanie utworzona nowa konsola. Proces konsoli podrzędnej może również dziedziczyć standardowe dojścia nadrzędnego, a także dostęp do buforu wejściowego i aktywnego buforu ekranu.
  • Tryb błędu ustawiony przez funkcję SetErrorMode.
  • Maska koligacji procesora.
  • Skojarzenie z zadaniem.

Proces podrzędny nie dziedziczy następujących elementów:

Dziedziczone dojścia

Proces podrzędny może dziedziczyć niektóre uchwyty rodzica, ale nie dziedziczyć innych. Aby spowodować dziedziczenie uchwytu, należy wykonać dwie czynności:

  • Określ, że uchwyt ma być dziedziczony podczas tworzenia, otwierania lub duplikowania uchwytu. Funkcje tworzenia zwykle używają bInheritHandle składowej struktury SECURITY_ATTRIBUTES w tym celu. DuplicateHandle używa parametru bInheritHandles.
  • Określ, że dziedziczone uchwyty mają być dziedziczone przez ustawienie parametru bInheritHandles na wartość TRUE podczas wywoływania funkcji CreateProcess. Ponadto w celu dziedziczenia standardowych dojść wejściowych, standardowych danych wyjściowych i standardowych błędów dwFlags składowej struktury STARTUPINFO musi zawierać STARTF_USESTDHANDLES.

Aby określić listę dojść, które powinny być dziedziczone przez określony proces podrzędny, wywołaj funkcję UpdateProcThreadAttribute z flagą PROC_THREAD_ATTRIBUTE_HANDLE_LIST.

Dziedziczony uchwyt odnosi się do tego samego obiektu w procesie podrzędnym, co w procesie nadrzędnym. Ma również tę samą wartość i uprawnienia dostępu. W związku z tym, gdy jeden proces zmienia stan obiektu, zmiana wpływa na oba procesy. Aby użyć uchwytu, proces podrzędny musi pobrać wartość uchwytu i "znać" obiekt, do którego się odwołuje. Zazwyczaj proces nadrzędny przekazuje te informacje do procesu podrzędnego za pośrednictwem wiersza polecenia, bloku środowiska lub jakiejś formy komunikacji międzyprocesowej .

Użyj funkcji SetHandleInformation, aby kontrolować, czy istniejący uchwyt jest dziedziczony, czy nie.

Dziedziczenie zmiennych środowiskowych

Proces podrzędny dziedziczy zmienne środowiskowe procesu nadrzędnego domyślnie. Jednak CreateProcess umożliwia procesowi nadrzędnego określenie innego bloku zmiennych środowiskowych. Aby uzyskać więcej informacji, zobacz zmienne środowiskowe.

Dziedziczenie bieżącego katalogu

Funkcja GetCurrentDirectory pobiera bieżący katalog procesu wywołującego. Proces podrzędny dziedziczy domyślnie bieżący katalog procesu nadrzędnego. Jednak CreateProcess umożliwia procesowi nadrzędnego określenie innego bieżącego katalogu dla procesu podrzędnego. Aby zmienić bieżący katalog procesu wywołującego, użyj funkcji SetCurrentDirectory.