APUE學習筆記-守護進程的建立

#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。

會話首進程:建立該會話的進程。

相關文章
相關標籤/搜索