遺產
子進程可以從其父進程繼承數個屬性和資源。 您也可以防止子進程從其父進程繼承屬性。 可以繼承下列專案:
- 開啟 CreateFile 函式所傳回的句柄。 這包括檔案、控制台輸入緩衝區、控制台螢幕緩衝區、命名管道、序列通訊裝置和mailslots的句柄。
- 開啟句柄來處理、線程、mutex、事件、旗號、命名管道、匿名管道和檔案對應物件。 CreateProcess、CreateThread、CreateMutex、CreateEvent、CreateSemaphore、CreateNamedPipe、CreatePipe和 CreateFileMapping 函式。
- 環境變數。
- 目前目錄。
- 除非進程已中斷連結或建立新的控制台,否則主控台。 子控制台進程也可以繼承父系的標準句柄,以及存取輸入緩衝區和使用中畫面緩衝區。
- 錯誤模式,如 SetErrorMode 函式所設定。
- 處理器親和性遮罩。
- 與作業的關聯。
子進程不會繼承下列專案:
- 優先順序類別。
- LocalAlloc、GlobalAlloc、HeapCreate和 HeapAlloc所傳回的句柄。
- 虛擬句柄,如同 getCurrentProcess或 getCurrentThread函式所傳回的句柄。 這些句柄僅適用於呼叫進程。
- LoadLibrary 函式所傳回的 DLL 模組句柄。
- GDI 或 USER 句柄,例如 HBITMAP 或 HMENU。
繼承句柄
子進程可以繼承其父代的一些句柄,但不能繼承其他句柄。 若要讓句柄繼承,您必須執行兩件事:
- 指定當您建立、開啟或複製句柄時,要繼承句柄。 建立函式通常會使用 bInheritHandleSECURITY_ATTRIBUTES 結構的成員來進行此用途。 DuplicateHandle 會使用 bInheritHandles 參數。
- 藉由呼叫 CreateProcess 函式時,將 bInheritHandles 參數設定為 TRUE,以指定要繼承的句柄。 此外,若要繼承標準輸入、標準輸出和標準錯誤句柄,dwFlagsSTARTUPINFO 結構的成員必須包含STARTF_USESTDHANDLES。
若要指定特定子進程應繼承的句柄清單,請使用 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 旗標呼叫 UpdateProcThreadAttribute 函式。
繼承的句柄是指子進程中的相同物件,如同父進程一樣。 它也具有相同的值和訪問許可權。 因此,當一個進程變更物件的狀態時,變更會影響這兩個進程。 若要使用句柄,子進程必須擷取句柄值,並「知道」它所參考的物件。 通常,父進程會透過其命令行、環境區塊或某種形式的 進程間通訊,將這項資訊傳達給子進程。
使用 SetHandleInformation 函式來控制現有句柄是否可繼承。
繼承環境變數
子進程預設會繼承其父進程的環境變數。 不過,CreateProcess 可讓父進程指定不同的環境變數區塊。 如需詳細資訊,請參閱 環境變數。
繼承目前目錄
GetCurrentDirectory 函式會擷取呼叫進程的目前目錄。 子進程預設會繼承其父進程的目前目錄。 不過,CreateProcess 可讓父進程為子進程指定不同的目前目錄。 若要變更呼叫程式的目前目錄,請使用 setCurrentDirectory函式。