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