当前位置:首页>编程日记>正文

linux中Daemon守护进程编程

本站寻求有缘人接手,详细了解请联系站长QQ1493399855

 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。

      一般情况下守护进程可以通过以下几种方式产生:

1,在系统启动的时候由启动脚本启动,这些启动脚本通常放在/etc/rc.d目录下

2,利用inetd超级系统服务器启动,如telnet等

3,由cron定时启动以及在终端用nohup启动的进程也是守护进程  

     由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。

守护进程的变成要点:
1. 蔽一些有关控制终端操作的信号
   这是为了防止在守护进程还没悠运行之前,控制终端收到干扰推出或者挂起
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
2. 在后台运行。

  为避免挂起控制终端而将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。

      if(pid=fork())
          exit(0);//是父进程,结束父进程,子进程继续
3. 脱离控制终端,登录会话和进程组
      进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:
    setsid()
4. 关闭打开的文件描述符

  进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:

  #define   NOFILE   256  ;//不同系统中不同数值
  for(i=0;i<NOFILE;i++)
         colse(i);
5. 改变当前工作目录
     进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/")
   chdir("/");
6. 重设文件创建掩模
    进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除0:
   umask(0);
7. 处理SIGCHLD(子进程退出信号)信号
   处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程 将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地 将SIGCHLD信号的操作设为SIG_IGN。

 signal(SIGCHLD,SIG_IGN);

下面给出一个例程

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

int init_daemon(const char *pname,int facility)
{
int pid;
int i;
/*忽略可能的终端信号*/
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
//创建子进程,父进程推出
if( (pid=fork()))
exit(EXIT_SUCCESS);
//是父进程,结束父进程,子进程继续
else if(pid < 0)
{
perror(
"fork error! ");
exit(EXIT_FAILURE);
}

setsid();
//设置新会话组长,脱离终端
for(i=0;i<NOFILE;i++)
close(i);

open(
"/dev/null",O_RDONLY);
open(
"/dev/null",O_RDWR);
open(
"/dev/null",O_RDWR);

chdir(
"/");
umask(
0);
signal(SIGCHLD,SIG_IGN);

openlog(pname,LOG_PID,facility);

return 0;
}

int main(int argc,char *argv[])
{
time_t ticks;
init_daemon(argv[
0],LOG_KERN);
while(1)
{
sleep(
1);
ticks
= time(NULL); //读取当前时间
syslog(LOG_INFO,"%s",asctime(localtime(&ticks)));//写日志信息
}

return 0;
}

http://www.coolblog.cn/news/ca5077b09ff0c479.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • Mac原生Terminal快速登录ssh
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • mysql commit 机制_1024MySQL事物提交机制
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • 2019-9
  • jquery 使用小技巧
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Django View(视图系统)
  • 【设计模式】 模式PK:策略模式VS状态模式
  • JS实现-页面数据无限加载
  • CSS小技巧——CSS滚动条美化
  • 最新DOS大全
  • 阿里巴巴分布式服务框架 Dubbo
  • 阿里大鱼.net core 发送短信
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 程序员入错行怎么办?
  • Arm芯片的新革命在缓缓上演
  • 两张超级大表join优化
  • 第九天函数
  • 通过Spark进行ALS离线和Stream实时推荐
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • 《看透springmvc源码分析与实践》读书笔记一
  • python3 错误 Max retries exceeded with url 解决方法
  • nagios自写插件—check_file
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • 行为模式之Template Method模式