2013-05-27 22 views
3

情景: 我正在開發其啓動並通過請求(TCP-IP)停止在一個守護進程守護進程監視應用程序。 爲了實現這一點,分叉之後,我打電話給setsid(),以便從父級(監視進程)「分離」新進程。試圖殺死一個衍生的進程終止與失效的過程跌宕

當我嘗試殺死其中一個進程時,監視應用程序創建的進程結束了。

這裏是我的代碼:

int retval; 
char* arg_list[] = { 
    NULL  /* The argument list must end with a NULL. */ 
}; 
retval = fork(); 
if (retval == 0) 
{ 
    umask(0); 
    setsid(); 
    execv(LBSDPATH, arg_list); 
    exit(0); 
} 

據我瞭解,停業/殭屍進程是指父並沒有與過程加入呢。不要setsid()解決它?

回答

3

父母需要撥打wait()waitpid()讓孩子進程從死亡/殭屍狀態中「釋放」。

這可以在父母的線程中完成,也可以在父母的信號處理程序中完成,服務於兒童死亡時收到的SIGCHLD信號。


更新

它交給需要有一個孩子重設父到init到現場讓它作爲達蒙由Mellowcandle在評論中指出:

只是fork()兩次。那就是:第一個fork()編輯過程只是fork() s關閉另一個。

讓第二個fork() ed過程做exec*(),並讓第一個fork()ed過程結束。

當那麼首先fork() ED處理結束時,它的子(所述第二fork() ED方法,並用它,它的後繼:所述exec*()「編一個)由init然後處理SIGCHLD /這個孩子死亡繼承。

+0

我知道,但我希望我產生的過程獨立工作,就像守護進程一樣。 – stdcall

+1

@Mellowcandle:然後'fork()'兩次。讓第二個'fork()'ed過程執行'exec *()',並且第一個fork()過程結束。當第一個'fork()'進程死亡時,它的子進程(第二個fork()'進程並且帶有exec *()編譯進程)由'init'繼承,然後處理'SIGCHLD '孩子的死亡。 – alk

+0

我不認爲我解釋自己是正確的,請參閱我的編輯問題。 – stdcall