Ubuntu

Ubuntu Linux 16.04 守護程序函式是否執行雙叉?

  • June 1, 2018

Ubuntu Linux 16.04 守護程序函式是否執行雙叉?如果是這樣,為什麼需要雙叉?

$$ EDIT May 30 2016 8:11 AM $$這是我在這個問題中所指的守護程序功能的官方 Linux 基金會原始碼。

92 int daemon(int nochdir, int noclose) 
93 { 
94     int status = 0; 
95 
96     openlog("daemonize", LOG_PID, LOG_DAEMON); 
97 

98     /* Fork once to go into the background. */ 
99     if((status = do_fork()) < 0 ) 
100         ; 
101 

102     /* Create new session */ 
103     else if(setsid() < 0)               /* shouldn't fail */ 
104         status = -1; 
105 

106     /* Fork again to ensure that daemon never reacquires a control terminal. */ 
107     else if((status = do_fork()) < 0 ) 
108         ; 
109 

110     else 
111     { 
112         /* clear any inherited umask(2) value */ 
113 

114         umask(0); 
115 

116         /* We're there. */ 
117 

118         if(! nochdir) 
119         { 
120             /* Go to a neutral corner. */ 
121             chdir("/"); 
122         } 
123 

124         if(! noclose) 
125             redirect_fds(); 
126     } 
127 

128     return status; 
129 } 

根據執行路徑,它會分叉一次或兩次。

我們似乎在引用daemon(3)庫呼叫,其原始碼可能位於 #1 https://github.com/lattera/glibc/blob/master/misc/daemon.c或 #2 https://github.com /bmc/daemonize/blob/master/daemon.c。這兩個版本都記錄在這個單一的手冊頁中。

#1 的原始碼顯示了一個fork(2). #2 的原始碼顯示了一個 double fork(2)。從表面上看,這兩種功能似乎都提供了相同的結果,但方式不同。

將其視為雙重fork(2)並不總是必要的,我認為這與您問題第二部分的主旨相反,並使其不再必要。然而,這種方法的根本原因是保證分叉的程序在任何情況下都不能重新獲得控制終端。較新的程式碼通過將孩子設置為新的會話負責人來解決此問題。

在這個和其他 StackOverflow 網站上還有其他相關問題會提出類似的問題。這是一個

引用自:https://unix.stackexchange.com/questions/286373