#include "myapue.h" #include <syslog.h> #include <fcntl.h> #include <sys/resource.h> #include <sys/stat.h> void daemonize(const char *cmd) { int i, fd0, fd1, fd2; pid_t pid; struct rlimit rl; struct sigaction sa; umask(0); if(getrlimit(RLIMIT_NOFILE, &rl) < 0) err_quit("%s: can't get file limit", cmd); if((pid = fork()) < 0) err_quit("%s: can't fork", cmd); else if(pid != 0) exit(0); setsid(); sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if(sigaction(SIGHUP, &sa, NULL) < 0) err_quit("%s: can't ignore SIGHUP", cmd); if((pid = fork()) < 0) err_quit("%s: can't fork", cmd); else if(pid != 0) exit(0); if(chdir("/") < 0) err_quit("%s: can't change directory to /", cmd); if(rl.rlim_max == RLIM_INFINITY) rl.rlim_max = 1024; for(i = 0; i < rl.rlim_max; i++) close(i); fd0 = open("/dev/null", O_RDWR); fd1 = dup(0); fd2 = dup(0); openlog(cmd, LOG_CONS, LOG_DAEMON); if(fd0 != 0 || fd1 != 1 || fd2 != 2){ syslog(LOG_ERR, "unexpected file descriptors %d %d %d", fd0, fd1, fd2); exit(1); } }
(1)<83>函數
umask函數:爲進程設置文件模式建立屏蔽字,並返回以前的值。ui
文件模式建立屏蔽字:在進程建立一個新文件或新目錄時,使用文件模式建立屏蔽字。其中爲1的位,表示新文件的訪問權限位關閉。spa
文件訪問權限:每一個文件有9個訪問權限位,分別是用戶、組、其餘的讀、寫、執行權限。rest
(2)<175>code
int getrlimit(int resource, struct rlimit *rlptr)函數:查詢進程的資源限制。進程
resource:指定一個資源。ip
RLIMIT_NOFILE:進程能打開的最多文件數。資源
RLIM_INFINITY:指定了一個無限量的限制。get
struct rlimit{cmd
rlim_t rlim_cur;//軟限制:當前限制
rlim_t rlim_max;//硬限制:當前限制的最大值
}
(3)<278>
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact )函數:檢查或修改與指定信號相關聯的處理動做。
signo:要檢查或修改其具體動做的信號編號。SIGHUP<253>:
act:要修改的動做。
oact:返回該信號的上一個動做。
struct sigaction
sa_handler:信號捕捉函數的地址,或,SIG_IGN(向內核表示忽略此信號),SIG_DFL(接到此信號後的動做是系統默認動做)
sa_mask:信號集,在調用信號處理程序時阻塞某些信號。
sa_flags:指定對信號處理的各個選項。
(4)<273>
sigemptyset函數:初試化指定的信號集,清除其中全部信號。必須使用此函數,不能保證act.sa_mask = 0會作一樣的事。
信號集:一種數據類型,可用於告訴內核不應發生該信號集中的信號。
(5)<63>
dup函數:複製一個現有的文件描述符,返回的新文件描述符必定是當前可用文件描述符中的最小數值。
open函數:
O_RDWR:讀寫打開。
(5)<378>(待看)
守護進程有集中的出錯記錄設施。
openlog函數:
syslog函數:
(6)<235>
setsid函數:創建一個新會話。
子進程必定不是一個進程組的組長,則建立一個新會話,發生3件事:
(1)該進程變成新會話的會話首進程,且是新會話中的惟一進程。
(2)該進程成爲一個新進程組的組長進程。
(3)該進程沒有控制終端。
會話:一個或多個進程組的集合。
進程組:一個或多個進程的集合。同一進程組中的各個進程接收來自同一終端的各類信號。每一個進程組有一個組長進程,其進程ID=進程組ID。
會話首進程:建立該會話的進程。