守护进程也称为精灵进程(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. JAVA代码MD5加密方法

    PwdEncoder.java 接口类 package com.common.security.encoder; /** * 密码加密接口 */ public interface PwdEncoder ...

  2. linux 下查看c 函数帮助

    帮助文档 man man MANUAL SECTIONS The standard sections of the manual include: User Commands System Calls ...

  3. maven pom文件报错:Multiple annotations found at this line 解决方案(转)

    研究maven多模块项目时,因为家里和公司不能同时开发,所以把家里搭建好的项目复制到公司继续研究, 当时家里的电脑搭建好项目之后是没问题的,但是复制到公司的eclipse上之后就看到pom文件出现下面 ...

  4. time_t time()

    time_t  atime,  btime; time(&atime); btime = time(0); 两种方式效果一样.

  5. Css预处理器---Less(三)

    四.Color函数 1.less提供的颜色运算函数,颜色会被转换成HSL色彩空间,然后再通道级别进行操作,函数如下: lighten(@color, 10%); //return a color wh ...

  6. win10 修改root文件

    1.进入Win10系统的hosts文件所在位置,我们直接输入C:\Windows\System32\Drivers\etc后回车就可以打开了,右键hosts文件,选择属性 2.点击hosts属性对话框 ...

  7. C#日期格式字符串的相互转换

    方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss ================================== ...

  8. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  9. Nginx常用功能

    3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...

  10. day1 hbuilder的使用

    一.互联网的原理 1.概述 html:用来制作网页. 互联网原理:上网即请求数据. 用户通过在浏览器上输入一个网址,通过HTTP协议向服务器发送请求,服务器做出响应,将相关的网页数据传输到本地计算机, ...