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函数:为进程设置文件模式创建屏蔽字,并返回之前的值。

文件模式创建屏蔽字:在进程创建一个新文件或新目录时,使用文件模式创建屏蔽字。其中为1的位,表示新文件的访问权限位关闭。

文件访问权限:每个文件有9个访问权限位,分别是用户、组、其他的读、写、执行权限。

(2)<175>

int getrlimit(int resource, struct rlimit *rlptr)函数:查询进程的资源限制。

resource:指定一个资源。

    RLIMIT_NOFILE:进程能打开的最多文件数。

    RLIM_INFINITY:指定了一个无限量的限制。

struct rlimit{

    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。

会话首进程:创建该会话的进程。



你可能感兴趣的:(APUE学习笔记-守护进程的创建)