模型

  • 创建孤儿进程 fork()
  • 创建新的会话 setid()
  • 改变当前目录为根目录chdir()
  • 重设文件权限掩码umask()
  • 关闭文件描述符close()

创建孤儿进程

创建孤儿进程只需要将父进程关闭保留子进程

pid_t pid_child=fork();
if(0<pid_child){
exit(0);
}

创建新的会话



会话组是一个或多个进程组的集合,一个shell就是一个会话,可以分为前台进程组和后台进程组,每个进程组都有一个组长,组长进程的pid就是进程组的id,当一个会话结束的时候,依附于它的进程都会关闭

setsid()函数用于创建一个新的会话,并使得当前进程成为新会话组组长,也就是说使进程完全独立出来,从而脱离所有其他进程的控制,但是setsid()不能在一个会话组长进程中被调用,所以我们先创建子进程,并使其成为孤儿进程,这样它就脱离了原来的会话,此时调用setsid可以使其成为一个新的会话的组长进程。当然,作为组长进程,虽然它脱离了原来的会话,失去了终端,满足了守护进程的需求,但是它完全可以自己再打开一个终端,所以我们有时会在准备好守护进程条件之后再fork一次创建孙进程,然后让子进程自杀,在孙进程中执行守护进程的代码,这样新的守护进程就不会开启自己的终端。

pid_t pid;
pid=setsid();

改变当前目录为根目录

守护进程的工作目录是不能被卸载的,选择根目录是个很好的方式,切换进程的工作目录可以使用chdir()

chdir("\");

重设文件权限掩码

文件权限掩码是指问家权限中被屏蔽掉的对应位,把文件权限掩码设置为0,可以增加该守护进程的灵活性,和$umask类似,设置进程的文件权限掩码的函数是umask()

umask(0);   //将文件权限掩码设为0

关闭文件描述符

如果父进程中打开的文件时候没有指定"close-on-exec"选项,那么子进程会继承父进程的文件描述符,这些文件描述符在制作守护进程的时候需要将其关闭。一个进程打开的所有文件描述符都在该进程的文件描述符表中,这个表的大小可以使用函数gettablesize()来获得

fdtablesize=gettablesize();
for(fd=0;fd<fdtablesize;fd++){
close(fd);
}

再次创建孤儿进程

pid_t pid_gchild=fork();
if(0<pid_gchild){
exit(0);
}
//孙进程执行的代码

Linux Daemon进程的更多相关文章

  1. Linux守护进程daemon

      守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启 ...

  2. Linux中创建Daemon进程的三种方法

    什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx,ssh服务进程sshd等.注意,其英文拼写为 ...

  3. Linux系统编程——Daemon进程

    目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...

  4. CentOS 7.4 初次手记:第一章 Linux守护进程(daemon)

    第一节 init & sysvinit 6 I sysvinit 运行顺序... 6 II Sysvinit和系统关闭... 7 III Sysvinit 的小结... 7 IV 运行级别.. ...

  5. .NET跨平台实践:用C#开发Linux守护进程-Daemon

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  6. linux 守护进程 daemon

    Linux的Service/Daemon你真的懂了吗? Linux 守护进程的启动方法 linux系统编程之进程(八):守护进程详解及创建,daemon()使用 linux守护进程 daemon 详解

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

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  8. .NET跨平台实践:用C#开发Linux守护进程(转)

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

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

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

随机推荐

  1. TCP三次握手和四次挥手状态变迁解析

    TCP是TCP/IP的传输层控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 首先需要了解几个名词:tcp标志位,有6种分别为:SYN(synchronous建立联机) .ACK(ackn ...

  2. using语法糖详解 2015-01-06 17:45 50人阅读 评论(0) 收藏

    前段事件在using外套try catch 突然想到,如果出现异常 会不会执行释放,不执行的话那服务器很可能导致崩溃... 特意上了CSDN问了大神..得到了答案.. Using相等于try catc ...

  3. 代码的坏味道(4)——过长参数列(Long Parameter List)

    坏味道--过长参数列(Long Parameter List) 特征 一个函数有超过3.4个入参. 问题原因 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法 ...

  4. 第三方登录插件.NET版XY.OAuth-CSharp

    XY.OAuth-CSharp GitHub:XY.OAuth-CSharp OSChina:XY.OAuth-CSharp 第三方登录插件.NET版 使用 首先,从NuGet上安装"XY. ...

  5. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

    由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...

  6. Genesis2000用c#开发外挂

    先上官方的说明 gateway is a command line utility for sending messages and commands to Genesis processes. Th ...

  7. [WCF编程]4.契约概述

    一.契约的基本概念 契约是消息参与者之间的约定.在SOA架构中,契约提供了服务通信所必需的元数据.契约用来定义数据类型,操作,消息交换模式和消息交换使用的传输协议.契约通常是在标准化平台中使用与编程语 ...

  8. ym—— Android网络框架Volley(体验篇)

    VolleyGoogle I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...

  9. 将GridView数据导入到excel,并提供下载

    之前项目中需要一个导出数据到Excel的功能,现在将代码记录下来.其实将girdView中的数据导出的代码很简单,如下: ) { Response.Charset="GB2312" ...

  10. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...