守护进程
先说概念吧: 守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
然后说 特点吧 : 守护进程最重要的特点是后台运行,其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端,会话和进程组、工作目录以及文件创建掩码等。编写守护进程实际上是把一个普通的进程按照它的特性改造成守护进程。
下面介绍守护进程的创建 它是分为5大步骤 完成:
1:创建子进程,父进程退出 fork()
2:在子进程中创建新的会话 setsid()函数
3:改变当前的工作路径 为了防止在当前路径找不到,所以一般改为 / 或者/tmp 用chdir()函数
4:重设文件权限掩码 umask 掩码 。 。 不会的可以在百度上学一下
5:关闭文件描述符 用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。
6:接下来就简单了。 就是做自己的事,写自己的代码了。相干什么干什么 。
下面贴出我的代码,写的不好看 ,不喜勿喷,谢谢!
/*************************************************************************
> File Name: deamon.c
> Author:
> Mail: 创建一个守护进程。
> Created Time: 2018年06月08日 星期五 18时54分26秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(void)
{
pid_t pid;
int i = 0;
//创建子进程,父进程退出 pid=0的时候是子进程,pid >0 的时候是父进程
pid = fork();
if(0 < pid)
{
exit(0);
}
if(0 > pid)
{
perror("fork error");
return -1;
}
//创建新会话组
setsid();
//改变文件路径
chdir("/");
//修改文件权限掩码
umask(0);
//返回打开的文件描述符的最大值
int fd = getdtablesize();
//关闭从父进程继承来的所有文件
for(i=0;i<fd;i++)
{
close(i);
}
//然后就是做自己想做的事了 我就想做个while(1)
while(1);
return 0;
}
写完编译运行 然后利用 ps -axj 命令来查看进程 :
下面是我的运行截图