(一)发行版:Ubuntu16.04.7
(二)记录:
(1)守护进程基本概念
a.守护进程是一个生存周期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些待发生的事件。
b.多数服务都是通过守护进程实现的。
c.关闭终端,相应的进程都会被关闭,而守护进程却能够突破这种限制。
d.守护终端是运行在后台,不跟任何控制终端关联。
比如任务管理器里面VMware中正运行着几个守护进程,但是并不会跟我的控制终端关联。
(2) 如何创建一个守护进程
必须作为我们init进程的子进程。不跟控制终端交互。
a.使用fork函数创建一个新的进程,然后让父进程exit函数直接退出(造成子进程成为孤儿进程,被init进程收留)
b.调用setsid函数来在会话内创建新的进程组以摆脱原来进程组中的控制。
c.调用chdir函数,将当前的工作目录改成根目录,增强程序的健壮性。(非必要)
d.重设我们umask文件掩码,增强程序的健壮性与灵活性。(非必要)
e.关闭文件描述符,节省资源(非必要)
f.执行我们需要执行的代码
运行a.out之后以及能够正常与控制台交互,说明程序进程已经结束,但是我们用ps aux | grep a.out查看进程时发现./a.out仍然在运行。这个时候他已经不再跟控制终端交互即使程序进程结束他也存在,他就是一个守护进程
(3)进程组与会话
多个进程构成一个进程组,多个进程组构成一个会话。
(三)命令:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{
pid_t pid;
//1.创建一个新的进程
pid=fork();
//2.父进程直接退出
if(pid>0)
exit(0);
//3.子进程调用setsid函数拜托控制终端
if(pid==0)
{
setsid();
//4.更改工作目录
chdir("/");
//5.重新设置umask文件掩码
umask(0);
//6.关闭0 1 2三个文件描述符(标准输入、输出、出错)
close(0);
close(1);
close(2);
//7.执行想要执行的代码
while(1){
}
}
return 0;
}