使用Windows API在C++中創建子進程時,可以允許繼承從父到子的句柄。在Microsoft示例"Creating a Child Process with Redirected Input and Output"中,將子進程的標準輸入/輸出重定向到由父級創建的管道,必須允許重定向管道的繼承可用。我正在開發一個小的演示類,它啓動一個外部可執行文件,讀取輸出,然後將其吐回給調用者(將返回的輸出記錄到文件中)。我試圖建立一個超時功能,它只會在撥打TerminateProcess()
關於孩子並繼續生活之前阻塞一段時間。選擇子進程繼承哪些句柄
但是,我發現通過允許句柄繼承,子進程也有一個句柄(可見於Process Explorer)到輸出文件。我不想讓子進程獲得這個句柄,但是在這種情況下(此演示類)的父進程不知道該句柄,所以我當前不能使用SetHandleInformation()
來特別取消標記輸出文件以將其排除在繼承之外。
我確定必須有更好的方法來繼承我想要的特定句柄,而不允許通過意外和不需要的句柄的「一攬子」繼承。不幸的是,我一直無法找到解決方案,瀏覽儘可能多的MSDN相關文章,並且讓Google陷入灰心。
至少,我需要做某些東西刪除子句柄,而不必在演示類中有這些句柄(它們被調用類使用,並且此演示類沒有明確的瞭解他們的存在)。
更多選擇性遺傳的解決方案?如果存在這樣的解決方案,我特別感興趣的解決方案可以特別聲明要繼承的句柄,並且所有未指定的句柄都不會被繼承。
謝謝。
儘管對原始擁有者的意圖不加猜測的情緒當然是合理的,但在這種特殊情況下,我很熟悉來電者的工作方式。該文件實際上是一個'ofstream',通常打開一個「streamName.open(」filename「);」雖然這似乎表明此std調用的默認行爲是創建一個可繼承的句柄,但我仍然覺得應該可以明確定義在創建子進程時應該繼承哪些句柄。我仍然希望這是可能的,而且有人知道如何。 – KevenK 2010-02-26 22:06:51
(從上面繼續)。我的空間用完了,但我也想感謝你分享你的時間和知識。我當然非常感謝允許創建者確定句柄的可繼承性的智慧,如果他們特別想分享它的話。我並不反對這種情緒,只是在這種情況下我知道這是一個意想不到的結果。我想相信有一個「直到指定的默認值」來對付目前的「默認所有,除非指定」設置。或許,我的一廂情願的想法!但是,感謝你的時間和智慧。 – KevenK 2010-02-26 22:10:40
創建進程時唯一的選項是讓進程繼承已設置爲可繼承的所有內容,或繼承任何內容。在該規則中,你需要找到句柄並在之後設置它們的可繼承性。如果文件流沒有用你想要的屬性創建文件,那麼你自己調用'CreateFile',然後使用'_open_osfhandle'和* fdstream.hpp *或者Boost.Iostreams類'file_descriptor'來包裝句柄,並且'stream'。 – 2010-02-26 22:49:11