守护进程也称为精灵进程(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. vue watch 监听element upload组件上传成功返回的url列表

    因为 on-success 上传成功返回的是一个异步的结果....如果父组件需要这个结果的话 必须用watch 监听 然后里面建立一个 save()方法 save方法里面再调用接口 传需要的上传之后的 ...

  2. Mac Maven配置

    Maven下载链接,解压到指定目录,我这里是 /Users/JYH/Desktop/Hadoop-2.7.2/apache-maven-3.3.9 打开终端,配置环境变量 输入命令 vi ~/.bas ...

  3. UGUI实现摇杆

    效果图

  4. 【网络设备】某防火墙基于IP地址的目的地址转换

    由于来自Internet的对政府,企业的网络攻击日益频繁,因此需要对内网中向外网提供访问服务的关键设备进行有效保护.采用目的地址NAT可以有效地将内部网络地址对外隐藏. 图中:公网中Internet用 ...

  5. C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

    之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...

  6. VS.C#如何向数据数据库中存入和读取图片的

    写入图片部分代码:假设图片为 test.gifbyte [] bytes = File.ReadAllBytes(@"c:\test.gif");SqlConnection con ...

  7. mysql 5.6 每天凌晨12:00 重置sequence表中的某个值

    #.创建evevt要调用的存储过程update_current_value_procedure delimiter // drop procedure if exists update_current ...

  8. DX9 DirectX键盘控制程序 代码

    // @time: 2012.3.26 // @author: jadeshu // des: DirectX键盘控制程序 #include <Windows.h> #include &l ...

  9. CALL与retn

    一.CALL 例如: 004013D9      CALL 00401C4C     //ESP = 0060F9C8 004013DE 相当于 sub esp,0x4; //ESP = 0060F9 ...

  10. html5-样式表的使用-初步

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...