目录

一.进程组和会话

二.守护进程的概念

三.守护线程的特点

四.守护进程创建的基本步骤


一.进程组和会话

1.进程组的相关概念:

进程除了有进程的PID之外还有一个进程组,进程组是由一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号

每个进程组有唯一的进程组ID,每个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长了,通常进程组ID等于进程ID那么这个进程就是对应进程组的组长。

2.会话的相关概念

会话是有一个或者多个进程组组成的集合

一个会话可以有一个终端,建立与控制终端连接的会话首进程被成为控制进程,一个会话的几个进程组可以分为前台进程和后台进程,而这些进程组的控制终端相同也就是sesion id是一样的当用户使用ctr +c 产生SIGINT信号时内核会发送信号给相应前台进程组的所有进程如果我运行一个程序我们想要把他放到后台运行我们可以在可执行程序的后面加一个& 举个列子:./test & 如果我们想要把他提到前台进程我们可以使用fg

二.守护进程的概念

守护进程也叫做精灵进程,是运行在后台的一种特殊进程他独立于控制终端并且可以周期性的执行某种任务或者等待处理某些发生的事件。

守护进程是非常有用的进程,在Linux当中大多数服务器用的就是守护进程比如Web服务器httpd等,同时守护进程完成很多系统的任务。当Linux系统启动的时候,会启动很多系统服务,这些进程服务是没有终端的也就是说你把终端关闭了这些系统服务是不会停止的,他们一直运行着他们有一个名字就叫做守护进程。

我们可以使用ps ajx来查看系统中的进程

参数说明:

  • a代表不仅列出当前用户的进程并且其他用户的进程也会被列出
  • 参数x表示不仅列出所有控制终端的进程也列出所有无控制终端的进程
  • 参数j表示列出也作业控制相关的进程

下面我们使用ps axj来查看系统中的守护进程

其中TTY为?号的都表示这个进程和终端没有关系。

三.守护线程的特点

守护进程是一种长期运行的进程,这种进程在后台运行并且不根任何控制终端关联其主要特点如下:

  • 生存周期长[不是必须]:一般是操作系统启动的时候他启动,操作系统关闭的时候他也关闭

  • 守护进程和终端没有关联,也就是说他们没有控制终端,所以你控制终端退出也不会导致守护进程退出

  • 守护进程是在后台运行不会占着终端,终端可以执行其它命令

linux操作系统本来就有很多的守护进程默默运行,维持系统的正常活动大概有30到50个, ps -efj ppid为0的进程为内核进程,跟随系统启动声明周期是随内核的,cmd列带[]的这种叫内核守护进程,老主init也是守护进程负责启动各运行层次特定的系统服务,所以很多进程的ppid是init.并且这个init进程也负责收养孤儿进程,cmd列不带[]我们称为普通守护进程,也叫做用户守护进程。

四.守护进程创建的基本步骤

1.设置权限掩码,调用umask(0)权限掩码不会对文件的权限有太多的影响

2.父进程创建子进程,fork一个子进程(脱离终端)出来然后父进程退出(把终端空出来不让中端卡住):固定套路。其中fork()的目的是想调用setsid()来建立新会话目的是子进程有单独的sid,而且子进程也成为了一个新进程组的组长,同时子进程不关联任何终端。(注意:调用setsid建立新会话的进程不能是进程组的组长)

3.由于守护进程和终端没有关系所以我们需要将子进程的标准输入和标准输出重定向到dev/null(空设备当中去)所以我们可以使用open函数打开这个空设备文件将子进程的标准输入和标准输出重定向到这个空设备对应的文件当中(黑洞确保守护进程不从键盘接收任何东西也把任何东西打印到屏幕上)

下面我们来看看创建守护进程的代码:

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include<sys/stat.h>
#include<cstdlib>
#include<fcntl.h>
//创建守护进程
int ngx_daemon()
{int fd;switch (fork())//创建子进程{case -1://创建子进程失败这里可以写日志return -1;case 0://子进程走到这里直接break即可break;default:exit(0);//父进程退出break;}//只有子进程才会走到这里if(setsid()==-1){//记录错误日志return -1;}umask(0);//设置权限掩码fd=open("/dev/null",O_RDWR);//打开黑洞设备以读写方式打开if(fd==-1){//记录错误日志return -1;}if(dup2(fd,0)==-1)//进行重定向{//记录错误日志return -1;}if(dup2(fd,1)==-1){//记录错误日志return -1;}if(fd>3){if(close(fd)==-1){//记录错误日志return -1;}}return 1;
}
int main(int argc, char *argv[])
{if(ngx_daemon()!=1){//创建守护进程失败可以做失败后的处理比如写日志等等return 1;}else{//创建守护进程成功执行守护进程要干的活for(;;){sleep(1);//打印了也没有用因为子进程已经重定向了,不会打印任何结果到标准输出上printf("休息一秒,进程id=%d!\n",getpid());}}return 0;
}

总结:

1.守护进程不会收到的信号SIGHUP:终端断开信号守护进程不会收到内核SIGHUP信号,如果收到了SIGHUP信号那么肯定是另外的进程发送给你的,很多守护进程把这个信号做为通知信号,表示配置文件已经发生改变守护应该重新读入其配置文件,同时也不会收到内核的SIGINT和SIGWINCH信号。

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

守护进程和终端没有关系但是后台进程能往终端上输出东西和终端有关联

守护进程关闭终端时不受影响而,后台进程会随着终端的退出而退出

守护进程(初学者必备)相关推荐

  1. ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

    前言 在上篇文章中<ASP.NET Core Docker部署>中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或 ...

  2. Linux 守护进程,编写(转载)

    设置守护进程过程: 1.创建子进程,父进程退出 2.在子进程中创建新会话 3.改变当前目录为根目录 4.重设文件权限掩码 5.关闭文件描述符 *6.守护进程里,忽略SIGCHLD信号 (即使fork两 ...

  3. Linux 守护进程的原理与实现

    一.守护进程概述 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定 ...

  4. Linux下一个简单守护进程的实现 (Daemon)

    在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...

  5. linux守护进程原理及创建详解

    在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统. ...

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

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

  7. 如何正确编写linux守护进程

    1.守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.如果想让某个进程不因为用户或终 ...

  8. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  9. Linux进程学习(孤儿进程和守护进程)

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程 ...

最新文章

  1. merge-two-smerge-two-sorted-listsorted-lists
  2. python处理utf8编码中文,及打印中文列表和字典
  3. c#在线程中打开类似msn的消息提示窗口
  4. IDEA中Alt + Insert快捷键定制生成类方法
  5. jquery实现的滚动新闻(多个实例代码)
  6. XBOX Series X规格如此强悍,如果被破解安装了win10,将对PC行业带来什么影响?
  7. spring boot + swagger2
  8. 车rc陀螺仪测试软件,利用加速度计和陀螺仪测量车辆运动
  9. 喵哈哈村的魔法考试 Round #14 (Div.2) 题解
  10. 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像
  11. 厉害了网页扫码,所有方法都给你总结到这了,赶紧收藏
  12. 这一晚注定属于C罗!回归首秀梅开二度,现场超过7万球迷见证这场胜利
  13. 家乡主题html模板,html+css模板 我的家乡有模板
  14. nginx: [warn] duplicate extension xxxx解决方案
  15. 【文献阅读】RL经典:Benchmarking Deep Reinforcement Learning for Continuous Control
  16. 如何写好产品需求文档
  17. 生成特定于查询的类API摘要 (Generating Query-Specific Class API Summaries)
  18. launchOptions利用userActivity呼起app设置
  19. Xcode 官方下载地址 https://developer.apple.com/downloads/
  20. 基于springboot的高校社团管理系统

热门文章

  1. 我眼中的OpenTracing
  2. ps处理图片合并以及图片矩形角转圆角
  3. 【毕业设计】基于微信小程序的备忘录记事助手
  4. 阿里云文本关键词过滤检测
  5. 设计图纸管理-图纸管理系统哪家好呢
  6. SkyEye硬件模拟平台:硬件仿真实现之一
  7. 【知识总结】数学必修四、必修五三角函数公式总结
  8. ElasticSearch_12_ES的高性能设计
  9. 刷题记录(Number of 1 Bits)
  10. mac上使用sips命令快速裁剪、旋转、翻转图片