一、守护进程

守护进程,也叫精灵进程(daemon)

它和普通后台进程的区别在于以下三点

1、守护进程自成会话,而普通后台进程则不一定

2、守护进程不受终端的控制

3、守护进程就是后台进程,而后台进程不同于守护进程

用ps axj命令查看系统中的进程,TPGID一栏为 -1 的进程(这些进程没有控制终端)就是守护进程。

二、实现

创建守护进程的步骤如下:

1、调用umask把【文件模式创建屏蔽字】 设置为 0

由于 umask 接收的参数会被取反,所以这个 0 传进去取反以后是最大的,也就是给该程序最大的权限

2、先fork,然后让父进程退出

这是因为,要设置成守护进程的进程不能使原进程组中的组长进程,所以fork的目的是创建一个子进程,这样,这个子进程一定不会是组长进程,然后父进程就没什么用了。

3、调用 setid 创建一个新会话

这时,这个进程会成为新会话的首进程(也是组长进程)

4、将当前工作目录改成根目录

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

6、忽略SIGCHILD信号

实现代码如下:

运行后,执行 ps axj

找到刚刚的进程

同时还可以看到,它的父进程是 1 号进程,因此守护进程也是孤儿进程

不过这里要注意的是,实际使用的时候并不需要我们造这个轮子了 有现成的函数

daemon(0, 0) 就可以让当前的进程变为孤儿进程

三、fork()两次的原因

通常daemon的实现跟上面的实现方式还有一处不同:fork() 调用了两次,让后将第二个fork 创建出来的子进程作为守护进程。

这是因为,如果只fork一次的话那么有可能有这样的情况:

第一次fork之后,父进程脱离,这时候子进程成为话首进程,子进程有可能会再打开一个控制终端,一旦这种事情发生,该进程就不再是守护进程了,因为它又一次受到终端的控制了

因此,如果再fork一次,那么这次得到的子进程将不可能是话首进程,因此不可能再打开终端了,所以通常用这个第二次fork出的子进程作为守护进程

转载于:https://blog.51cto.com/zhweizhi/1828211

linux中的守护进程相关推荐

  1. linux中Daemon守护进程编程

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

  2. linux查看守护进程格式,详解Linux中的守护进程

    一.什么是守护进程 Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互.其它进程都是在用户登录或运行程序时创建,在运⾏结束或⽤户注销时终止,但系统服务进程不 ...

  3. linux怎么监控守护进程,linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  4. linux daemon(守护进程)

    什么是Daemon Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互.Daemon程序一般作为系统服务使用.Unix/Linux中的daemon进程类似于W ...

  5. C语言实现Linux系统的守护进程创建

      大家好,我是练习编程时长两年半的昆工第一ikun,今天我们来分享一下进程的有关知识,并且用c语言来创建一个Linux系统的守护进程. 目录 一.进程相关接口函数 1.创建子进程 -- fork ( ...

  6. linux中终止停止进程_如何在Linux中终止进程或停止程序

    linux中终止停止进程 当一个进程行为异常时,您有时可能想要终止或终止它. 在本文中,我们将探讨几种使用gedit作为示例应用程序从命令行以及图形界面终止进程或应用程序的方法. 使用命令行/终止符 ...

  7. 如何在linux中关闭一个进程

    如何在linux中kill一个进程 刚开始学习Linux的时候,总是直接点击×来关闭程序.虽然知道这是关闭整个终端程序,但是奈何如此简单的事情对于新手来说都是很困难的.

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

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

  9. Linux中线程和进程的区别

    Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...

最新文章

  1. 同步与异步,阻塞与非阻塞的区别
  2. 【程序人生】不想一辈子做底层码农?快来看看这十条箴言
  3. 在线教育平台 PK 与 SAP 小众化的思考
  4. 自动规避代码陷阱——自定义Lint规则
  5. 再学 GDI+[91]: TGPImage(11) - 转灰度图像
  6. 计算机减法英语,英语加减乘除的表达
  7. STM32的ADC通道间干扰的问题
  8. 请问android直接post请求登录地址成功后,webview还是现实登录界面
  9. php 如何设置后台,phpcms怎么重新设置后台网址
  10. BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )
  11. 来了!iPhone 12今晚天猫首销:12期分期免息,还送5G流量包
  12. c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解
  13. 实用工具推荐:LICEcap(屏幕录制.gif)
  14. 6.1. 概率密度估计
  15. Android 手势放大图片
  16. 硅谷系创业公司,这家深耕物联网22年的Fabless终于走到上市关口
  17. 【小白】线性表的链式存储结构的实现(C语言版)
  18. C语言表白程序系列(不接受表白就让你电脑关机)
  19. java 图片缩放 失真_Java图片缩小后不失真的代码(缩略图)
  20. 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式

热门文章

  1. ajax 如何禁止 预检请求,如何跳过“选项”预检请求?
  2. nextcloud+nginx+mysql,Ubuntu搭建Nginx-Nextcloud环境
  3. app调html页面,app界面管理(风格色调).html
  4. php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)
  5. 单例模式及C++实现代码
  6. 01-复杂度2 Maximum Subsequence Sum (25 分)
  7. 流程控制语句(bash)
  8. Linux上Libevent的安装
  9. MVC架构 -- 初学试水选课管理系统
  10. 签入在服务器上之后,别人获取了,在解决方案资源管理器中找不到。