什么守护进程?

守护进程是运行在后台的一种用来提供服务的进程,他脱离控制台独立运行,守护进程是一种很有用的进 程。

Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。

守护进程的特征?

1、后台运行
  守护进程最重要的特性是后台运行。脱离控制台,但我们关闭控制台是不能关闭守护进程的,可以使用kill -9 守护进程的PID 
来强行关闭守护进程。
2、独立于其运行前的环境
  守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
例如打开的文件描述符,因为我们的进程是直接继承了父进程,所以同样继承了父进程打开的文件,例如标准输入、输出、错误,当然这3个文件描述符最终是从init进程中继承而来的。
3、启动方式
  守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。 
 

进程间关系?

(1)无关系
(2)父子进程关系
(3)进程组(group)由若干进程构成一个进程组。一个进程必定属于一个进程组,也只能

属于一个进程组。 一个进程组中可以包含多个进程。 进程组的生命周期从被创建开始,

到其内所有进程终止或离开该组,而且这个组存在与否与组长存在与否没有关系,也就是

说,只要这个组中还有一个进程在运行,那么这个进程组就是存在的,而且就算是组长死

了,那么组长不会变为还在运行的进程。

提供进程组就是为了方便对进程进行管理。例如当我们要将一个进程组中的所有进程都关

闭,那么就会一个一个依次关闭,但是这样是很麻烦的,并且必须要严格按照进程间父子

兄弟关系顺序,否则会扰乱进程树。如果有了进程组之后,我们就可以调用命令以进程组

ID(也就是组长的PID)为参数关闭所有的这个组中的进程。
必须注意的是,只有当前进程不是进程组的组长时,才能创建一个新的会话。调用setsid

之后,该进程成为新会话的会话组长,也是一个新的进程组组长。如果是进程组组长,那么

调用这个是会失败的。

(4)会话(session)会话就是进程组的组:一个或多个进程组的集合,其实就是可以认为

是一个终端。

守护进程的编写步骤:

1:父进程fork创建子进程,父进程退出,子进程继续运行。

int ret = fork();

if (0 < ret)

exit(0);     // 父进程直接退出

原因:因为我们要接下来要用setsid函数来脱离控制台,而前面说过,如果是进程组组长是不能调用setsid函数来开启新的会话的,

而在shell下运行一个进程,那么这个进程就是一个新的进程组组长进程,所以我们就通过父进程fork创建子进程,而子进程虽然也是属于

父进程这个进程组中,但是子进程并不是组长,所以是可以调用setsid函数来开启新的会话。

2:子进程使用setsid创建新的会话期,脱离控制台。

sid = setsid();

   if (-1 == sid)
  {
        perror("setsid error");
        exit(-1);
   }

3:重新设定umask值

进程从创建它的父进程那里继承了文件创建掩模,这可能会修改了守护进程所创建的文件的存取位。为防止这一点,按如下方法将文件创建掩模清除:

umask(0);

4:关闭打开的所有文件描述符

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

//关闭该进程打开的所有文件,以免由于该进程操作文件导致其他进程无法操作文件
//首先要获取进程能够打开的最大的文件数
int cnt = sysconf(_SC_OPEN_MAX);
int i = 0;
for (i = 0;i < cnt; i++)
{
close(i);
}

5:改变进程工作目录

进程活动时,其工作目录所在的文件系统是不能卸下的。一般需要将工作目录改变到根目录/。意思就是如果我们的守护进程的工作目录在某个文件系统的目录下,那么

将会导致这个文件系统无法被卸载。

chdir("/");

6:重定向标准输入、标准输出、标准错误

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

Linux守护进程编写方法及原理的更多相关文章

  1. Linux守护进程编写指南

    Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...

  2. linux守护进程编写实践

    主要参考:http://colding.bokee.com/5277082.html (实例程序是参考这的) http://wbwk2005.blog.51cto.com/2215231/400260 ...

  3. 【转】学习Linux守护进程详细笔记

    [原文]https://www.toutiao.com/i6566814959966093837/ Linux守护进程 一. 守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的 ...

  4. linux C守护进程编写

    linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服 ...

  5. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

  6. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  7. Linux守护进程详解(init.d和xinetd) [转]

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...

  8. Linux守护进程的编程实现

    Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...

  9. Linux守护进程详解(init.d和xinetd)

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. ...

随机推荐

  1. 手动更新花生壳域名的动态IP

    http://帐号:密码@ddns.oray.com/ph/update?hostname=hahaha.vicp.cc&myip=182.xx.200.xx 花生壳的文档地址 例子 1.使用 ...

  2. thinkphp3.2.3+smarty解决success调用模板错误心得

    最近学习thinkphp上瘾,出现success找不到模板问题,查阅各大神解决方案,分享一下针对新手如何解决该问题,如有不对的地方请大神指正 1.首先修改自己的config文件,添加如下配置代码:// ...

  3. thinkphp配置rewrite模式访问时不生效 出现No input file specified解决方法

    使用thinkphp配置rewire模式的路径访问网站时, 直接复制官网的.htaccess文件的代码复制过去 1 2 3 4 5 6 <IfModule mod_rewrite.c>   ...

  4. Mysql慢查询日志过程

    原创地址 :http://itlab.idcquan.com/linux/MYSQL/922126.html mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出代码实现中耗费资源的sql语句 ...

  5. [转][Java]自定义标签简介

    作用:自定义标签主要用于移除 jsp 页面中的 java 代码. 实现:需要完成以下两个步骤: 编写一个实现 Tag 接口的 Java 类,把页面 java 代码移到这个 java 类中.(标签处理类 ...

  6. ROS创建Web代理(Web proxy)给QQ使用HTTP代理

    使用Web代理可以提高网页的访问速度,因为访问的数据会存储在内存或是硬盘中,就会直接从代理服务器中读取.同时,为了提高网络访问的安全性,可以给Web代理服务器设置相应的权限,使它的安全性得到提高. 下 ...

  7. Thinkphp 查询条件 and 和 or同时使用即复合查询

            thinkphp 3.2快捷查询OR查询&分割表示AND查询讲解         快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表 ...

  8. Hive中创建结构体、数组以及map

    ROW FORMAT DELIMITED 分隔符设置开始语句 FIELDS TERMINATED BY:设置字段与字段之间的分隔符 COLLECTION ITEMS TERMINATED BY:设置一 ...

  9. java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数

    问题一:java的构造函数能否被继承? 笔者初学java看的一本书说:“java的子类自然的继承其超类的“非private成员”. 通常java的构造函数被设置为public的(若你不写构造函数,ja ...

  10. Android BroadcastReceiver 的简单实现

    参考:http://yangguangfu.iteye.com/blog/1063732 BroadcastReceiver的实现不难,其实就是三部曲:注册,接收,发送. 但有一点较疑惑的是:当我启动 ...