守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊的进程。它独立于控制终端并且周期性的执行某种任务负等待处理某些发生的事件。因为他们没有控制终端,所以说他们是在后台运行的。

  守护进程的特点:

    (1)Linux系统启动时会启动很多系统服务进程,守护进程没有控制终端,不能直接和用户交互。

    (2)其他进程都是在用户登录或者运行程序时创建,在运行结束或用户注销时终止,但守护进程不受用户登录注销的影响,只受开机关机的影响。

  守护进程存在的原因:

    daemon函数存在的原因是因为控制终端由于某些原因(如断开终端连接)会发送一些信号的原因。而接受处理这些信号的缺省动作会让进程退出。这些信号会由于终端敲一些特殊按键产生。

  守护进程和后台进程的区别:

    (1)守护进程是后台进程,但后台进程不一定是守护进程

    (2)守护进程运行是与终端无关的,是不能往终端上打消息的。

    (3)守护进程的会话和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行。

  创建守护进程:

    创建守护进程最关键的一步是调用setsid函数创建了一个新的会话(session),并成为session Leaser.

    #include<unistd.h>

    pid_t setsid(void);

    该函数调用成功时返回新创建的session的id(其实就是当前进程的id),出错返回-1.注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1.要保证当前进程不是不是进程组的Leader也很容易,只要先fork再调用setsid就行了。fork创建的子进程和父进程在同一个进程组里面,进程组的Leader必然是该组的第一个进程,所以子进程不可能是改组的第一个进程,在子进程中调用setsid就不会有问题了。

  成功调用该函数的结果是:

    (1)创建一个新的session,当前进程称为session Leader,当前进程的id就是session的id。

    (2)创建一个新的进程组,当前进程称为进程租的Leader,当前进程的id就是进程租的id。

    (3)如果当前进程原本有一个控制终端,则他失去这个控制终端,称为一个没有控制终端的进程。所谓失去进程终端是指,原来的进程终端仍然是可打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。

  创建守护进程的步骤:

    (1)调用umask将文件模式创建屏蔽字设置为0

    (2)父进程fork出子进程,然后子进程调用setsid,父进程直接退出(保证了子进程不是一个进程组的进程组长)

    (3)调用setsid创建一个新的会话(调用成功会使调用进程成为会话的首进程,并成为一个进程租的组长进程,调用进程没有控制终端)

    (4)将当前工作目录更改为根目录

    (5)关闭不需要的文件描述符

    (6)忽略SIGCHLD信号。

  要知道在创建守护进程的时候fork一次和fork两次的两者的区别,就要先知道第一次fork和第二次fork都起到什么作用:

    (1)调用一次fork的作用:

      第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面上的setsid服务,因为调用setsid函数的进程不能是组长进程,如果不fork出子进程,则此时的父进程是进程组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。

    (2)第二次fork的作用:

      虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。

      只有会话首进程能打开终端设备,也就是在fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,第二次不是必须的,是可选的,市面上有些开源项目也是fork一次。

转自:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6445962.html

daemon进程fork一次和fork两次的区别?的更多相关文章

  1. 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程

    GDB的那些奇淫技巧 evilpan 收录于 Security  2020-09-13  约 5433 字   预计阅读 11 分钟  709 次阅读  gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...

  2. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03

    百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  3. Linux下进程的创建(system(); fork(); exec*())

    0. system(); system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(): 特点:原进程和子进程各自运行,且原进程需要等子进程运行完后 ...

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

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

  5. Daemon进程

    这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒 ...

  6. linux fork函数与vfork函数,exit,_exit区别

    man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...

  7. Linux下fork()、vfork()、clone()和exec()的区别

    转自Linux下fork().vfork().clone()和exec()的区别 前三个和最后一个是两个类型.前三个主要是Linux用来创建新的进程(线程)而设计的,exec()系列函数则是用来用指定 ...

  8. 在Hudson Job中启动daemon进程

    场景 在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了.   环境 CentOS 6,Hudson 3.0 ...

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

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

随机推荐

  1. IOC解耦-面向接口编程的优点

    原文:https://blog.csdn.net/jj_nan/article/details/70161086 参考:https://www.cnblogs.com/landeanfen/p/477 ...

  2. PHP学习路径及练手项目合集

    PHP 技术路径中包含入门知识.PHP 编程基础.PHP Web 框架.项目实战和项目进阶五个模块.模块中的课程将带着你逐步深入,学会如何使用 PHP 实现项目一个博客,聊天室,MVC框架及搜索系统等 ...

  3. json.dumps与json.loads实例

    import json data= { 'no' : 1, 'name' : 'Runoob', 'url' : 'http:\\www.runoob.com' } json_str = json.d ...

  4. 用websploit获取管理员后台地址

    1, use web/dir_scanner 2, set TARGET http://www.****.com 3, run SOURCE: https://sourceforge.net/proj ...

  5. 2sum,3sum,4sum,ksum

    1. 2sum 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  6. xmlns:dubbo 路径错误

    It goes normal when change <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

  7. python shutil.copytree 解决目标目录存在的情况

    直接修改copytree的实现即可,如下: #copytree中找到 os.makedirs(dst),加入判断,就这么简单 if not os.path.exists(dst): os.makedi ...

  8. PyQT5速成教程-1 简介与环境搭建

    本文由 沈庆阳 所有,转载请与作者取得联系! PyQt简介 一个良好的界面是人机交互中十分重要的一环. Python作为脚本语言,起初并未拥有GUI开发的部分.但随着其开放的扩展性,使得Python不 ...

  9. caffe slover文件详解

    solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --solver=*_slover ...

  10. 定义一个Rectangle类,该类提供getLength和getWidth方法。

    import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种 ...