2-26 守护进程程序设计
来源:互联网 发布:手机怎么差评淘宝网店 编辑:程序博客网 时间:2024/06/06 13:58
(本节笔记的实验代码,在这里)
1. 基本概念
守护进程,也就是daemon(精灵)进程,是Linux中的一种服务进程。守护进程具有以下特点:
1.1 不占用控制终端,守护进程都在后台运行。([root]#./app &)
1.2 独立于控制终端。一般进程有对应的TTY(如PTS/8),但守护进程没有对应的控制终端,ps aux命令查看守护进程对应的TTY显示“?”(如下图smbd进程)
1.3 周期性运行。
2. 守护进程设计要素
2.1后台运行
守护进程不占用任何一个控制终端,实现方法是调用通过创建子进程来充当守护进程,而父进程退出,子进程在后台运行的方式。
『
pid = fork()
if(pid > 0)
exit(0);
else(pid == 0)
{
/* 子进程为守护进程 */
}
』
2.2独立于控制终端
守护进程脱离控制终端。
/* 脱离控制终端,不与任意TTY关联 */
setsid(); /*<unistd.h> */
2.3脱离父进程的影响(继承了父进程的一些因素)
2.3.1修改工作目录
进程活动时,其工作目录所在的文件系统不能卸载。在守护进程被创建时,会继承父进程的工作目录,因此需要将守护进程的工作目录切换到根目录。
chdir("/"); /* <unistd.h> */
2.3.2修改文件权限掩码
文件权限掩码是指屏蔽文件权限中的对应位(如掩码“500”会屏蔽文件创建者的可读可执行权限),在守护进程被创建时,会继承父进程的文件权限掩码,影响子进程中新创建的文件的访问权限。因此,需要重新对子进程中的权限掩码清零。
umask(0); /* <sys/types.h> <sys/stat.h> */
2.3.3 关闭打开文件
守护进程被创建时,会继承父进程一些打开的文件,这些文件被打开会一直消耗系统资源,因此子进程被创建时应把这些文件关闭。
for(i= 0; i < MAXFILE; i++)
close(i);
3. 综合实例
/* touch daemon.c */
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int i;
int fd;
int flag = 1;
char buff[64] = "sleep 10seconds!\n";
/* 1.创建子进程作为守护进程 */
pid_t pid;
pid = fork();
if(0 > pid)
{
printf("Createprocess fail!\n");
exit(1);
}
if(0 < pid)
exit(0);
/* 2.守护进程脱离控制终端 */
setsid();
/* 3.守护进程工作目录更改到根目录 */
chdir("/");
/* 4.对文件权限掩码清零 */
umask(0);
/* 5.关闭文件 */
for(i = 0; i < 65535; i++)
{
close(i);
}
/* 6.在文件里周期性地写入数据 */
while(1)
{
if(1 == flag)
{
if(-1 ==(fd = open("/arm/150707_daemon/sleep.log", O_RDWR | O_CREAT, 0777)))
{
printf("Createfile fail!\n");
exit(1);
}
flag = 0;
}
write(fd,buff, strlen(buff));
sleep(10);
}
close(fd);
return 0;
}
- 2-26 守护进程程序设计
- linux守护进程程序设计
- 【Linux应用程序设计1、2】守护进程概念及实验二则
- (2.1.26)守护进程
- linux守护进程编程(2)
- 18.4.2 Internet守护进程
- linux守护进程编程(2)
- 守护进程守护自身
- 守护线程、守护进程
- 守护进程
- 守护进程
- 守护进程
- 守护进程
- 进程守护
- 守护进程
- 守护进程
- 守护进程
- 守护进程
- 从hello world 说程序运行机制
- Android 6.0运行时权限理解
- Android各种编译错误的解决方案
- 4.5.2 平衡二叉树
- 理解Linux的性能
- 2-26 守护进程程序设计
- 抽象类和接口面试要点
- leetCode_Longest Consecutive Sequence
- Canvas 中 isPointInPath
- [已解决]Gradle 3.0 出现问题
- 排序算法总结
- ActiveMQ练习
- iOS 10 的适配问题
- Java7中NIO学习之创建新的文件和文件夹