守护进程设计

课程索引

什么是守护进程

守护进程, 也就是通常说的Daemon( 精灵) 进程,
是Linux中的一种服务进程。 它的特点是:
•不占用控制终端(后台 运行)
•独立于控制终端
•独立于控制终端
•周期性运行
例如: smb

设计要素

2. 1 后台运行

守护进程需要独立于任何一个控制终端。实现方法调用是通
过创建子进程来充当守护进程,而父进程退出,这样子进程
就可以在后台运行。(范例展示)
pid=fork();
if(pid>0)
if(pid>0)
exit(0); //父进程退出
else (pid==0)
{
//守护进程
}

2. 2 独立于控制终端

守护进程不能占用控制终端,因此需要在后台运行。实现方
法是调用 setsid()函数。
pid=fork();
if(pid>0)
exit(0); //父进程退出
exit(0); //父进程退出
else (pid==0) //守护进程
{
setsid();
。。。。。。
}

2. 3 摆脱父进程影响

2. 3. 1 修改工作目录

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

2. 3. 2 修改文件权限掩码

文件权限掩码是指屏蔽掉文件权限中的对应位。 比如掩码是
500,它就屏蔽了 文件创建者的可读与可执行权限。 由于子
进程要继承父进程的文件权限掩码,这势必影响子进程中 新
创建的文件的访问权限, 为避免该影响,就需要重新对子进
程中的权限掩码清零。 通常的使用方法为函数:
程中的权限掩码清零。 通常的使用方法为函数:
umask(0)

2. 3. 3 关闭打开文件

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

综合实例

daemon.c

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 int main()
 5 {
 6     pit_t pid;
 7     int i,fd,flag = 1;
 8     char *buf = "I am a daemon!\n";
 9
10     //创建子进程
11     pid = fork();
12     if(pid <0)
13     {
14         printf("fork error!\n");
15         exit(1);
16     }
17     if(pid >0)
18     {
19         exit(0);
20     }
21     //2.脱离控制终端
22     setsid();
23
24     //3.1改变工作目录
25     chdir("/");
26
27     //3.2清除掩码
28     umask(0);
29
30     //3.3关闭打开的文件
31     for(i=0;i<65535;i++)
32     {
33         close(i);
34     }
35     //4.守护进程的实际工作
36     while(1)
37     {
38         if((flag == 1)&&(fd = open("tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600)) < 0)
39         {
40             printf("open file error!\n");
41             flag = 0;
42             exit(1);
43         }
44         write(fd,buf,strlen(buf));
45         close(fd);
46         sleep(1);
47     }
48     return 0;
49 }

daemon.c

时间: 2024-10-25 21:04:09

守护进程设计的相关文章

[Python网络编程]浅析守护进程后台任务的设计与实现

在做基于B/S应用中,经常有需要后台运行任务的需求,最简单比如发送邮件.在一些如防火墙,WAF等项目中,前台只是为了展示内容与各种参数配置,后台守护进程才是重头戏.所以在防火墙配置页面中可能会经常看到调用cgi,但真正做事的一般并不是cgi,比如说执行关机命令,他们的逻辑如下: (ps:上图所说的前台界面包含通常web开发中的后端,不然也没有socket一说) 为什么要这么设计 你可能疑惑为什么要这么设计,我觉得理由如下: 首先有一点说明,像防火墙等基本上都运行在类Linux平台上 1.安全问题

转:linux守护进程的启动方法

Linux 守护进程的启动方法 作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res)

Python实例浅谈之五Python守护进程和脚本单例运行

一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行. Python有时需要保证只运行一个脚本实例,以避免数据的冲突. 二.Python守护进程 1.函数实现 #!/usr/bin/env python #coding: utf-8

C#开发Linux守护进程

C#开发Linux守护进程 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多

.NET跨平台实践:再谈用C#开发Linux守护进程

Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多子进程,父子进程,父子进程通讯与控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多线程! 这篇帖子的目的就是进一步完善,让

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

Linux守护进程的启动方法

导读 “守护进程”(daemon)就是一直在后台运行的进程(daemon),通常在系统启动时一同把守护进程启动起来,本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行,这并不容易,举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'

浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给大家分别介绍一下这三种特殊的进程! 1.孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的. #include <sys/types.h> #include <unistd.h> #inclu

用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验. 为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品. 消息队列说白了就是一个最简单的先进先出队列,队列的一个成员就是一段文本.正是因为消息队列实在太简单了,当拿着消息