繼承

子進程可以從其父進程繼承數個屬性和資源。 您也可以防止子進程從其父進程繼承屬性。 可以繼承下列專案:

  • 開啟 CreateFile 函式傳回的控制碼。 這包括檔案的控制碼、主控台輸入緩衝區、主控台螢幕緩衝區、具名管道、序列通訊裝置和 mailslots。
  • 開啟控制碼來處理、執行緒、mutex、事件、號志、具名管道、匿名管道和檔案對應物件。 這些是由 CreateProcessCreateThreadCreateMutexCreateEventCreateSemaphoreCreateNamedPipeCreatePipeCreateFileMapping 函式分別傳回。
  • 環境變數。
  • 目前的目錄。
  • 除非中斷連結進程或建立新的主控台,否則主控台。 子主控台進程也可以繼承父代的標準控制碼,以及輸入緩衝區和使用中螢幕緩衝區的存取權。
  • 錯誤模式,如 SetErrorMode 函式所設定。
  • 處理器親和性遮罩。
  • 與作業的關聯。

子進程不會繼承下列專案:

繼承控制碼

子進程可以繼承其父代的一些控制碼,但無法繼承其他控制碼。 若要讓控制碼繼承,您必須執行兩件事:

  • 指定當您建立、開啟或複製控制碼時,要繼承控制碼。 建立函式通常會針對此目的使用SECURITY_ATTRIBUTES結構的bInheritHandle成員。 DuplicateHandle 會使用 bInheritHandles 參數。
  • 在呼叫CreateProcess函式時,將bInheritHandles參數設定為 TRUE,以指定要繼承的控制碼。 此外,若要繼承標準輸入、標準輸出和標準錯誤控制碼,STARTUPINFO結構的dwFlags成員必須包含STARTF_USESTDHANDLES。

若要指定特定子進程應該繼承的控制碼清單,請使用PROC_THREAD_ATTRIBUTE_HANDLE_LIST旗標呼叫UpdateProcThreadAttribute函式。

繼承的控制碼是指子進程中的相同物件,如同父進程一樣。 它也有相同的值和存取權限。 因此,當一個進程變更物件的狀態時,變更會影響這兩個進程。 若要使用控制碼,子進程必須擷取控制碼值,並「知道」它所參考的物件。 通常,父進程會透過其命令列、環境區塊或某種形式的 處理序間通訊,將此資訊傳達給子進程。

使用 SetHandleInformation 函式 來控制現有控制碼是否可繼承。

繼承環境變數

子進程預設會繼承其父進程的環境變數。 不過, CreateProcess 可讓父進程指定不同的環境變數區塊。 如需詳細資訊,請參閱 環境變數

繼承目前目錄

GetCurrentDirectory函式會擷取呼叫進程的目前目錄。 子進程預設會繼承其父進程的目前目錄。 不過, CreateProcess 可讓父進程為子進程指定不同的目前目錄。 若要變更呼叫進程的目前目錄,請使用 SetCurrentDirectory 函 式。