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)
同文件权限掩码一样,子进程还会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且会导致文件所在的文件系统无法卸载。因此在子进程中需要将这些文件关闭。
①不占用控制终端(即后台运行)
②独立于控制终端
③周期性运行
设计守护进程的要素为:
实现后台运行的方法是通过创建子进程来充当守护进程,而父进程退出 ,这样子进程就可以在后台运行了。
实现进程独立于控制终端的方法是调用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); } }
相关文章推荐
- linux相关术语
- Linux的缓存内存 Cache Memory详解
- Linux 常用函数
- linux中C语言获取高精度时钟gettimeofday函数
- linux下编译sqlite3的API遇到问题解决
- Linux Pthread——1
- 显示器 Linux 性能 18 (一个命令行工具传递)
- TQ2440 学习笔记—— 5、Linux烧写——USB
- Centos 6.4 python 2.6 升级到 2.7
- Linux下如何用GCC编译动态库
- 搭建嵌入式linux应用程序调试环境
- Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】
- CentOS启用iptables防火墙
- Linux中SVN定时备份总结
- Linux基础一(个人整理)
- [Ptrace]Linux内存替换(五)x86_64平台代码注入
- linux学习记录
- Linux驱动开发概述
- 用proc实时管理 Linux
- Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】