2017-06-01 54 views
3

我正在閱讀Nginx的開放源代碼,我想知道爲什麼有人殺死父進程並讓子進程處理程序的其餘部分?爲什麼不讓父進程處理它?非常感激你的幫助。殺死父進程並在fork()之後離開子進程的目的是什麼?

我使用Eclipse CDT調試程序,這導致我的調試進入死路,因爲它繼續調試父進程,而不是子進程(實際上處理程序的其餘部分)。

下面是代碼片段:

ngx_int_t 
ngx_daemon(ngx_log_t *log) 
{ 
    int fd; 
    switch (fork()) { 
    case -1: 
     ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); 
     return NGX_ERROR; 

    case 0: 

     break; 

    default: 
    exit(0); 

    } 
/* Do stuff*/ 
} 

編輯:我理解的過程是一個deamonizing程序,但我一直在想,爲什麼我們應該做的是,在開始?

+7

這是將守護程序與父進程的執行環境斷開連接的一種方法。這也是讓程序繼續在後臺運行的一種方式,而用戶可以單獨繼續工作,這在今天的後臺作業的shell中並不是非常需要,只留下第一個原因。 –

+2

如果您爲每個查詢分支,當您更改配置時,您想讓分支完成他們的工作,並殺死父級以使用新配置啓動一個新配置 –

+0

@Someprogrammerdude,謝謝您的回覆。但是,您介意解釋爲什麼我們應該將守護進程從父進程的執行環境中斷開?我已經閱讀了Linux中的守護進程,但我仍然沒有清楚地理解它。非常感謝:) –

回答

2

對程序進行deamonizing的主要部分是將其與控制終端斷開連接。請致電setsid()

setsid()要求調用者不是進程組組長(直接從具有作業控制的shell運行的進程)。

如果你fork然後繼續在孩子,孩子絕對不會是一個過程組的領導者,它允許setsid()調用成功。

之後,您應該重複fork + exit程序,以確保繼續的孫子不是會議的領導者,確保它仍然沒有控制終端(會話領導者(由setsid()設置)有能力獲取控制終端,甚至可能無意中通過打開終端文件)。

+0

所以我假設deamonize程序的目的是讓它在後臺運行並等待請求。爲此,我們不是在代碼中使用循環,而是在每一個循環中用'fork()'和'exit()'父進程對它進行deamonize,這是否正確? –

+2

程序的實現主要是將它與控制終端斷開連接。守護進程的功能(無論是將hello world打印到日誌並退出還是進入服務器環路)與其deamon狀態(無控制終端+一些其他小細節)無關。檢查出https://stackoverflow.com/questions/3095566/linux-daemonize – PSkocik

+0

嗨@PSkocik,我明白現在deamonizing程序的程序。不過,我仍然對於一開始就將它毀滅的目的感到困惑。根據你的回覆,我認爲我的第一個假設是錯誤的。那麼,爲什麼我們需要「從控制終端上斷開一個程序」呢? –