linux实现daemon程序

转载自:http://hi.baidu.com/addcn/blog/item/e43c73ca84057616bf09e620.html
linux实现daemon程序

编写Linux系统下Daemon程序的方法步骤

 

一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。

本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。

二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的 用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。

三、Daemon程序编写规则

编写Daemon程序有一些基本的规则,以避免不必要的麻烦。

1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。

2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。

3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。

4、设置文件创建mask为0,避免创建文件时权限的影响。

5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信 息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。在使用syslog前需要首先启动syslogd程序,关于syslogd程序的 使用请参考它的man page,或相关文档,我们就不在这里讨论了。

四、一个Daemon程序的例子 编译运行环境为Redhat Linux 8.0。

我们新建一个daemontest.c程序,文件内容如下:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>

int daemon_init(void) 
{ pid_t pid; 
if((pid = fork()) < 0) return(-1); 
else if(pid != 0) exit(0); /* parent exit */ 
/* child continues */ 
setsid(); /* become session leader */ 
chdir("/"); /* change working directory */ 
umask(0); /* clear file mode creation mask */ 
close(0); /* close stdin */ 
close(1); /* close stdout */ 
close(2); /* close stderr */ 
return(0); } 
void sig_term(int signo) 
{ if(signo == SIGTERM) 
/* catched signal sent by kill(1) command */ 
{ syslog(LOG_INFO, "program terminated."); 
closelog(); exit(0); } 
} 
int main(void) 
{ if(daemon_init() == -1) 
{ printf("can't fork self\n"); exit(0); } 
openlog("daemontest", LOG_PID, LOG_USER); 
syslog(LOG_INFO, "program started."); 
signal(SIGTERM, sig_term); /* arrange to catch the signal */ 
while(1) { sleep(1); /* put your main program here */ } 
return(0); }

使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c编译完成后生成名为daemontest的程序,执行./daemontest来测试程序的运行。

使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、session ID、控制终端等内容。

部分显示内容:

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND

1098 1101 1101 1074 pts/1 1101 S 0 0:00 -bash 1 1581 777 777 ? -1 S 500 0:13 gedit 1 1650 1650 1650 ? -1 S 500 0:00 ./daemontest 794 1654 1654 794 pts/0 1654 R 500 0:00

ps axj 从中可以看到daemontest程序运行的进程号为1650。

我们再来看看/var/log/messages文件中的信息: Apr 7 22:00:32 localhost

daemontest[1650]: program started.

显示了我们在程序中希望输出的信息。

我们再使用kill 1650命令来杀死这个进程,/var/log/messages文件中就会有如下的信息:

Apr 7 22:11:10 localhost daemontest[1650]: program terminated.

使用ps axj命令检查,发现系统中daemontest进程已经没有了。

五、参考资料

Advanced Programming in the UNIX Environment W.Richard Stevens

 

http://zhiwei.li/text/tag/daemon/

http://www.chineselinuxuniversity.net/articles/2153.shtml

 

使用 Zope3 技术建立 Python 服务 (Unix 版本)

http://eishn.blog.163.com/blog/static/65231820069310828642/

daemon.py: daemonize function for Python

http://www.clapper.org/software/python/daemon/#Installation

机房监控之Python变daemon守护进程

http://www.linuxboy.net/wordpress2/2009/05/26/288.html

Python Daemon(守护进程)

http://hi.baidu.com/sunorr/blog/item/ef42c1f86dcc1c09d9f9fde9.html

http://snippets.dzone.com/posts/show/1532

(翻译)Python标准库的threading.Thread类

http://www.cppblog.com/len/archive/2008/06/24/54472.html

python多线程程序的中断(信号)处理

http://www.162cm.com/archives/904.html

以daemon方式运行一个程序

http://bbs3.chinaunix.net/thread-1073255-1-1.html

==============

用 Python写 daemon

http://blog.csdn.net/snleo/archive/2008/12/24/3592275.aspx

http://www.linuxforum.net/forum/showflat.php?Board=python&Number=380279

http://blog.chinaunix.net/u/5547/showart_1213999.html

http://bbs2.chinaunix.net/thread-1275803-1-1.html

[转][Python 一招鲜系列] 守护进程一招鲜

http://blog.163.com/sea_haitao/blog/static/7756216200921023932171/

http://www.kekeyu.com/database/open_2050607696.html

http://qingfengxiyu.spaces.live.com/blog/cns!E5F7A3AEF9B09ED!222.entry

python 非阻塞读数据

 

 

http://www.mangbar.com/task/docview/5d023b211427315f01142a701a150335
编写daemon进程,检测信号实现功能 编写一个后台进程。当检测到SIGHUP(远程挂断)信号时,该进程获得系统运行时间(读取/proc/uptime文件,该文件第一列为系统启动到现在的时间(以秒为单位),第二列为系统空闲的时间(以秒为单位)),将其追加写入日志文件。 检测到SIGUSR1信号,后台进程退出。 立即下载

相关推荐

Demon

Demon

Linux进程控制编程--实验5

一、实验目的: 练习使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程,利用信号机制定制突发事件处理的编程,编写用信号机制对动态产生的进程实施管理,掌握多进程并发编程的基本方法。 二、实验内容: 先创建用户家目录下创建文件名为“姓名+学号+05”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下。要求将所有源代码与数据文件打包成文件”学号-姓名-lab5.tar.gz...

qq_40165417的博客 7328

daemon_python:Linux守护进程的python实现

Linux守护进程设计规范及python实现 首先,守护进程是一类在后台执行,生命周期较长的进程,它一般随系统启动运行,在系统关闭的时候停止。 守护进程编码规范: 首先要做的被称为 umask,这一步骤会将文件创建掩码重置为0。这一步的原因是守护进程继承(inherited)得到的文件掩码有可能会拒绝某些特定的文件操作权限。如果守护进程想要创建文件,那有可能它需要设置特定的文件操作权限。例如,如果守护进程想要创建允许组读和写(group-readand group-write)权限的文件,但继承得到的文件创建掩码屏蔽了这个权限,则创建操作不会成功。 调用 fork 并使父进程退出(exit)。这一步骤的目的在于。首先,如果守护进程是通过一个简单的shell命令建立的,那么在父进程终止的时候shell会认为命令已经结束了继而结束守护进程。其次,子进程继承得到父进程的groupID同时也获得了

操作系统第五次作业

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《操作系统作业5_银行家算法》, 一起来围观吧 https://blog.csdn.net/xiangbing911/article/details/109152218?utm_source=app

qq_50160761的博客 221

Linux进程控制编程

任务1: 要求: 编写一个进程创建实验程序task51.c,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下: p1:I am father process p11: 当前时间是< 年 月 日 时 分 秒> p12: I am young brother process p121:我的学号是<您的学号xxx> p122:我的姓名是<您的姓名xxx> ...

ywd171的博客 1950

2-怎么编写一个标准的 daemon 进程_Adv

一、概述 Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行

cpxsxn的博客 612

linux deamon 日志,linux实现daemon程序

编写Linux系统下Daemon程序的方法步骤一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。本文介绍了在Linux编写Daemon程序的步骤,并给出了例子程序。二、Daemon程序简介Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,...

weixin_33933280的博客 233

Linux c++服务程序Daemon最简单的实现方式

Linux上面的服务程序就是Daemon守护进程,这里不详情讲Daemon(其实我也不是很了解),这里只是介绍如何实现把C++程序转化为Daemon守护进程。 其实将普通程序变成服务进程(启动后就不会在被关闭),主要是将普通程序变成一个类似于“孙悟空”(没有父程序)的程序,就不会因为父进程退出而退出。这里就用到fork的概念,这个我也不是很清楚,有兴趣的可以bing一下。 其实c++中提供了一个daemon(int nochdir, int noclose)函数用来实现我们需要的功能,我们只需要在我们的

遥远的心 1016

Linux daemon进程的应用、实现和原理

什么情况下用daemon进程 生产环境下,除了我们ssh登录上去,然后手动跑的那部分以外,其他都是自动运行的,这些大部分都应该是后台执行的。如何才能后台执行呢? nohup ./XXX & 由系统的其他daemon进程启动。这样的话,你的程序是它的子进程,跟终端没关系。退出终端也不会导致进程退出。如写在crontab里。 写成daemon程序,可以手动执行,退出终端时程序不退出

纯,属虚构 3173

linux怎么把自己的程序作为后台程序运行

.要使自己的程序作为daemon进程,自己的程序需要遵循一些基本规则    1.调用fork    2.在子进程中调用setsid()    3.把工作目录更改为根目录chdir("/"). (可选)    4.关闭不需要的描述符 (可选)  int main(int argc, char** argv ) {   if( argc == 2 &&   ( strcasecmp

lpp1989的专栏 1794

python实现的守护进程(Daemon)用法实例

本文实例讲述了python实现的守护进程(Daemon)用法。分享给大家供大家参考。具体如下: def createDaemon(): "'Funzione che crea un demone per eseguire un determinato programma…"' import os # create - fork 1 try: if os.fork() > 0: os._exit(0) # exit father… except OSError, error: print 'fork #1 failed: %d (%s)' % (error.

编写Linux系统下Daemon程序的方法步骤

转自:http://blog.csdn.net/analogous_love/article/details/52806722 一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。  本文介绍了在Linux编写Daemon程序的步骤,并给出了例子程序。  二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Dae

Barry的博客 545

linux环境下使用daemon函数实现守护进程

daemon进程是后台守护进程,比如linux 下server都是daemon进程,像httpd、sshd等这些服务你肯定听说过,如果我们想写一个后台运行程序应该怎么做呢?其实非常容易,只要添加unistd.h头文件,然后在调用daemon函数即可...

AlbertS Home of Technology 2951

将 Java 程序作为 LinuxDaemon 进程以及防止程序多次运行

将 Java 程序作为 LinuxDaemon 进程以及防止程序多次运行作者:frogdan出处:CSDN(一)使 Java 程序成为 LinuxDaemon 进程        Java 程序是编译后通过 Java 虚拟机(JVM)解释执行的,从执行“java SomeProgram”开始直到程序结束才会把命令行交还给用户,中途用户若退出登录或关闭 SHELL 则会中断程

可能是世界上最好的蛋 1127

Apache Commons Daemon 使用

Apache Commons Daemon 使用 https://blog.csdn.net/catherine160/article/details/21444119

毅香雪海的博客 2876

简单进程监控程序

简单进程监控程序 文章目录简单进程监控程序题目描述解题思路详细编码实现1.判断进程2.检查文件3.处理注释4.函数封装5.整体代码运行脚本参考文章 题目描述 作业题目:写一个 Shell 脚本来进行进程的死活监控 作业描述:此 Shell 脚本能检查配置文件中记录的进程是否在系统中运行。如果在系统中运行则显示进程ID(PID),如果不在运行则显示 DOWN 文字。 配置文件(check_procs.conf): systemd smbd nmbd #logd sshd 脚本命名为check_proc.sh

qq_42582489的博客 1217

c语言实现一个线程池——附程序demon,可编译执行

备注:线程池学习时阅读的博客连接 初学线程池,在网上找了大量的文章,阅读参考后,以开头链接为模板自己写了一个demon 一、线程池介绍 1.线程池的应用就是为了在需要大量线程创建、销毁时提高程序的执行效率而出现的 2.线程池重要的一个知识就是对队列的引用,通过读取队列的数据去执行队列中的任务,通过队列的数量判断是否需要创建、销毁线程!c语言创建队demon 二、线程池demon示例 #include<stdio.h> #include<stdlib.h> #include<pt

afootball的博客 469
上一篇: 国际模糊C代码大赛
下一篇: python 学习之输出流重定向
fly_hyp
博客等级 码龄24年 8粉丝 97原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值