守护进程也称精灵进程( Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并 且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。 Linux的⼤大多数服务器就是⽤用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用 户交互。其它进程都是在⽤用户登录或运⾏行程序时创建,在运行结束或⽤用户注销时终止,但系统 服务进程不受⽤用户登录注销的影响,它们⼀一直在运行着。这种进程有⼀一个名称叫守护进程 (Daemon)。
守护进程自己就是一个会话
创建守护进程:
1、先使用umask将文件模式屏蔽字设置为0
2、调用fork,父进程退出(exit)。原因:1)如果该守护进程是作为⼀一条简单的shell命令 启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个进程组的组长进程。
3、 调⽤用setsid创建一个新会话。setsid会导致:1)调用进程成为新会话的首进程。 2)调用 进程成为⼀一个进程组的组长进程 。3)调⽤用进程没有控制终端。(再次fork一次,保证 daemon进程,之后不会打开tty设备)
4. 将当前⼯工作⽬目录更改为根⽬目录。 5. 关闭不在需要的⽂文件描述符。 6. 其他:忽略SIGCHLD信号。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
void mydaemon()
{
umask(0);
if(fork() >0)
{
exit(0);
}
else if(fork()<0)
{
return ;
}
setsid();
chdir("/");
close(0);
close(1);
close(2);
signal(SIGCHLD,SIG_IGN);
}
int main()
{
mydaemon();
while(1)
{
}
return 0;
}
为什么创建守护进程要fork两次?
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。
只有会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程。