Ubuntu
Ubuntu Linux 16.04 守護程序函式是否執行雙叉?
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 的原始碼顯示了一個 doublefork(2)
。從表面上看,這兩種功能似乎都提供了相同的結果,但方式不同。將其視為雙重
fork(2)
並不總是必要的,我認為這與您問題第二部分的主旨相反,並使其不再必要。然而,這種方法的根本原因是保證分叉的程序在任何情況下都不能重新獲得控制終端。較新的程式碼通過將孩子設置為新的會話負責人來解決此問題。在這個和其他 StackOverflow 網站上還有其他相關問題會提出類似的問題。這是一個。