daemon进程是指长时间运行在后台的进程,也叫守护进程.
为什么会有daemon进程?
由于控制终端的原因(例如断开终端连接)会产生一些信号, 进程接受到这些信号的缺省动作是让进程退出.
daemon进程的特点:
没有控制终端,在后台运行
pid_t pid = fork(); if( pid != 0 ) { exit(0);//parent } //first children printf("first child: PID: %d\n", getpid()); if(setsid() == -1) { printf("setsid failed\n"); assert(0); exit(-1); } umask(0); pid = fork(); if( pid != 0) { exit(0); } //second children printf("second child: PID: %d\n", getpid()); chdir ("/"); for (int i = 0; i < 3; i++) { close (i); } int stdfd = open ("/dev/null", O_RDWR); dup2(stdfd, STDOUT_FILENO); dup2(stdfd, STDERR_FILENO);
重设文件掩码, 由于fork会从父进程继承文件创建掩码,所以将文件创建掩码清0
* 第2次fork
主要目的: 防止进程再次打开一个控制终端
因为打开一个控制终端的前提条件是:“该进程必须是会话组长”, 再fork一次之后,进程ID就不
等于sid了,所以也就无法打开新的控制终端。
* chdir(“/”)
由于fork会继承当前的工作目录,当进程没有结束时,其工作目录是不能被卸载的,
为了防止这种情况,守护进程一般会将工作目录改变到根目录下.
* 关闭文件描述符,并重定向标准输出、错误
fork得到的进程会继承父进程打开的文件描述符,所以需要将他们关闭.
由于守护进程在后台运行,所以不应该在终端有任何输出信息,将标准输出和标准错误重定向到
/dev/null
# 守护进程与&结尾的后台运行程序的区别