2010-06-28 75 views
3

我有兩個進程,A和B.在某個點A創建B.創建B後,如果A的進程被殺死,我希望B仍然在。如何創建一個不是其創建過程的子進程?

我正在使用CreateProcess()來創建B,而且我似乎無法找到任何方法使它在不成爲孩子的情況下創建過程。與ShellExecuteEx()一樣,但我可能會丟失一些標誌。

有誰知道我可以用它來做什麼?

編輯:我忘了提,這兩個進程需要一個手柄或進程ID其他

+0

你看CREATE_NEW_PROCESS_GROUP CreateProcess()的創建標誌參數嗎? – vanza 2010-06-28 21:20:14

回答

1

你可以嘗試進程A創建過程C,其創建過程B,然後進程C將立刻結束(終止)。在進程B中,只存在關於直接父進程(不是更多運行的C的進程ID)的信息,而不存在關於進程A的信息。因此,如果「A的進程樹被終止」,進程B可能會保持運行。

例如,您啓動Process Explorer(請參閱http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx),然後啓動Total Commander。從Total Commander開始,您可以啓動cmd.exe。從cmd.exe啓動notepad.exe。然後在cmd.exe中輸入「exit」。終止cmd.exe後,您可以看到notepad.exe將不再顯示在Total Commander(totalcmd.exe)下。在Total Commander(totalcmd.exe)的Process Explorer「Kill Process Tree」中選擇後,您可以看到notepad.exe保持運行狀態。

+0

好吧,我試過了,我想它會做,我忘記的一件事是兩個進程都需要對方的進程ID。有了這個解決方案,過程B將有過程A的ID,但A只有B's。 我想我可以通過傳遞某種消息來解決這個問題。 謝謝! – Pedro 2010-06-28 22:18:01

+0

每個進程都可以設置退出代碼(關於'ExitProcess'或C函數'exit')。因此,如果進程C(中間進程)作爲退出代碼返回進程B的進程ID,則進程A可以例如就'GetExitCodeProcess'函數給出它。 – Oleg 2010-06-28 22:31:44

+0

是的,我認爲這就是我要做的,這似乎有點冒險,但它夠好,至少現在 – Pedro 2010-06-29 02:41:08

3

您可以在createprocess API中將paramaeter dwcreationflags設置爲DETACHED_PROCESS。