您的位置:首页 > 运维架构 > Linux

Linux守护进程设计

2015-08-12 22:23 441 查看
Linux或Unix系统在系统引导的时候会开启许多服务,这些服务称为守护进程,也就是通常所说的Daemon(精灵)进程,它具有以下几个特点:

①不占用控制终端(即后台运行)

②独立于控制终端

③周期性运行

设计守护进程的要素为:



实现后台运行的方法是通过创建子进程来充当守护进程,而父进程退出 ,这样子进程就可以在后台运行了。

实现进程独立于控制终端的方法是调用setsid()函数。

进程活动时,其工作目录所在的文件系统不能卸载。例如:我们是从/mnt/usb目录下启动该守护进程的,那么守护进程的工作目录就是/mnt/usb,我们就无法在守护进程还在运行的情况下umount /mnt/usb。所以一般需要将守护的工作目录切换到根目录。调用函数为chdir(“/”);

文件权限掩码(umask)设置了文件创建时的默认权限。如文件权限掩码为022时,则我们利用open函数创建一个文件并通过参数0666设定文件权限为666时,实际上创建的文件的权限为666-022=644。由于子进程要继承父进程的文件权限掩码,这势必影响子进程中新创建的文件的访问权限,为避免该影响,就需要重新对子进程中的权限掩码清零。通常使用的方法为调用函数:umask(0)

同文件权限掩码一样,子进程还会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且会导致文件所在的文件系统无法卸载。因此在子进程中需要将这些文件关闭。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
void main()
{
/*创建子进程,并让父进程退出*/
pid_t pid=fork();
if(pid>0)
exit(0);
if(pid<0)
exit(1);
/*使守护进程独立于控制终端*/
setsid();
/*修改工作目录*/
chdir("/");
/*修改文件权限掩码*/
umask(0);
/*关闭文件*/
int i;
for(i=0;i<65535;i++)
close(i);
/*守护进程的任务*/
while(1)
{
int fd=open("/home/jx/myfile",O_RDWR | O_CREAT | O_APPEND,0666);
if(fd>0)
{
char *buf="hello world\n";
size_t count=strlen(buf);
write(fd,buf,count);
close(fd);
}
sleep(1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: