#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。
会话首进程:创建该会话的进程。