守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。守护进程脱离终端的主要原因有两点:(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。(2)(如其他用户登录该终端后,以前的守护进程的错误信息不应出现)由终端上的一些键所产生的信号(如中断信号),不应对以前从该终端上启动的任何守护进程造成影响。要注意守护进程与后台运行程序(即加&启动的程序)的区别。
守护进程也被称为精灵进程,是生存周期比较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时终止,且没有控制终端,在后台运行。
编程流程:
先fork,退出父进程
通过setsid()创建新对话 (使其失去进程组组长身份,以免和其它进程关联起来)
再fork,退出父进程
子进程中调用chdir函数,修改工作目录 (将其放在不可卸载目录下,因为生存周期长,可能误杀)
调用mask函数,清除掩码 (去除权限)
关闭所有文件描述符 (长时间后台运行,所以不需要的描述符要关闭)
代码:
void mydaemon() //只fork()一次
{
umask(0); //用umask将文件模式创建为屏蔽字为0
if(fork() == 0) //fork子进程,关闭父进程
{
}
else
{
exit(0);
}
setsid(); //让子进程成为一个守护进程
chdir("/"); //更改当前目录为根目录
close(0); //关闭默认的文件描述符表
close(1);
close(2);
signal(SIGCHLD, SIG_DFL); //忽略SIGCHLD信号
}
int main()
{
mydaemon();//
daemon(0, 0); //系统自己定义的守护进程,没有关闭它的默认的文件描述符表,两个参数(默认更改路径到'/', 不关闭文件描述符表)
while(1)
{}
return 0;
}