守护进程Daemon

news2024/11/26 13:44:45

进程组、对话期和控制终端关系

  1. 每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组。
  2. 产生在控制终端上的输入(Input)和信号(Signal)将发送给会话的前台进程组中的所有进程。对于输出(Output)来说,则是在前台和后台共享的,即前台和后台的打印输出都会显示在屏幕上。
  3. 终端上的连接断开时 (比如网络断开或 Modem 断开),挂起信号将发送到控制进程(controlling process) 。
  4. 一个用户登录后创建一个会话。一个会话中只存在一个前台进程组,但可以存在多个后台进程组。
  5. 第一次登陆后第一个创建的进程是shell,也就是会话的领头进程,该领头进程缺省处于一个前台进程组中并打开一个控制终端可以进行数据的读写。【当在shell里运行一行命令后(不带&)创建一个新的进程组,命令行中如果有多个命令会创建多个进程,这些进程都处于该新建进程组中,shell将该新建的进程组设置为前台进程组并将自己暂时设置为后台进程组。比如sleep 1 | sleep 2 | sleep 3

进程ID

任何用XShell登陆,只允许一个前台进程和多个后台进程。【即在命令行运行其他进程后,就没法再让bash再对指令作出响应,说明bash被切换为后台进程】

进程除了有PIDPPID,还有组ID PGID会话ID SID终端进程组IDTPGID

[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ sleep 10000 | sleep 20000 | sleep 30000
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps ajx | head -1 && ps ajx | grep sleep
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
12145  1089 12145 12145 ?           -1 S     1001   0:00 sleep 180
15703  1782  1782 15703 pts/6     1782 S+    1001   0:00 sleep 10000
15703  1783  1782 15703 pts/6     1782 S+    1001   0:00 sleep 20000
15703  1784  1782 15703 pts/6     1782 S+    1001   0:00 sleep 30000
12598  1895  1894 12598 pts/5     1894 S+    1001   0:00 grep --color=auto sleep
11424 11757 11424  1227 ?           -1 Sl       0   1:11 /bin/sh -c sleep 100
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps ajx | head -1 && ps ajx | grep 15703
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
15703  1782  1782 15703 pts/6     1782 S+    1001   0:00 sleep 10000
15703  1783  1782 15703 pts/6     1782 S+    1001   0:00 sleep 20000
15703  1784  1782 15703 pts/6     1782 S+    1001   0:00 sleep 30000
12598  1995  1994 12598 pts/5     1994 R+    1001   0:00 grep --color=auto 15703
12247 15703 15703 15703 pts/6     1782 Ss    1001   0:00 /bin/bash --init-file /home/yyq/.vscode-server/bin/7f329fe6c66b0f86ae1574c2911b681ad5a45d63/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh

在命令行中,同时结合管道启动多个进程 sleep 1 | sleep 2 | sleep 3,这3个进程(sleep 10000、sleep 20000、sleep 30000)父进程都是bash,所以它们三是兄弟关系,可以用匿名管道进行通信。

组ID PGID

同时被创建的多个进程是一个组的,第一个被创建的进程是组长进程。(sleep 10000、sleep 20000、sleep 30000是一个进程组的,组ID是1782,组长是sleep 10000)

进程组是一个或多个进程的集合,他们与同一作业相关联。每一个进程组都有唯一的进程组ID PGIDPGID 能够在用户层改动,使用setpgid()函数可以改变当前进程的 PGID。通过fork()函数产生的子进程会继承它的父进程的进程组ID

每一个进程组都有一个组长进程,组长进程的PGID等于其PID,组长进程能够先退出。

在某个进程组中只要有一个进程存在,则该进程组就存在,与其组长进程是否存在无关。进程组的最后进程能够退出或转移到其它进程组。

bash自成一组。

进程组的生命周期:组中最后一个进程终止或其加入其他进程组(离开本进程组)为止。

终端进程组ID(TPGID),用来标识一个进程是否处于一个和终端相关的进程组中。前台进程组中的进程的TPGID=PGID,后台进程组的PGID≠TPGID。若该进程和任何终端无关,其值为TPGID=-1

前台进程组

该进程组中的进程能够向终端设备进行读、写操作的进程组。例如登陆shell(例如bash)通过调用int tcsetpgrp(int fd, pid_t pgrp); 函数设置为某个进程组pgrp关联终端设备fd,该函数执行成功后,该进程组pgrp成为前台进程组。

前台进程组中的进程的TPGID=PGID,后台进程组的PGID≠TPGID

后台进程组

后台进程组中的进程只能够向终端设备

会话session

会话是一个或多个进程组的集合。系统函数getsid()用来获取某个进程的会话IDSID

会话首进程是创建该会话的进程。

一般一个用户登录后新建一个会话,每个会话也有一个ID来标识(SID)。登录后的第一个进程叫做会话领头进程(session leader),通常是一个shell/bash。对于会话领头进程,其PID=SID。

任何一个控制终端,需要有多个进程/进程组来为用户提供服务(例如bash),当然用户自己也可以启动进程/进程组。这些给用户提供服务的进程/进程组又有一个会话的机制。

每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组

控制终端controlling terminal

从终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。

  1. 一个会话对应一个控制终端,建立于控制终端相连接的会话首进程被称为控制进程;
  2. 一个会话中的几个进程组可被分为一个前台进程组和几个后台进程组,假设一个会话有一个控制终端,则他有一个前台进程组;
  3. 不管何时键入终端的中断键,都会将中断信ID发送给前台进程组的全部会话
  4. 不管何时键入终端的退出键,都会将退出信ID发送给前台进程组的全部会话

一个会话一般会拥有一个控制终端用于执行IO操作。会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端。与控制终端建立连接的会话领头进程也称为控制进程 (controlling process) 。

一个会话只能有一个控制终端

在这里插入图片描述

守护进程Daemon

守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程,大多数服务都是用守护进程实现的。比如:像我们的tftp,samba,nfs等相关服务。

是指自成一个会话,调用系统函数setsid(前提是当前进程不是进程组组长),与终端相连的。

守护进程本质是孤儿进程的一种,但是孤儿进程仍属于某个会话,而守护进程自成一个会话

生命周期随系统

守护进程会长时间运行,常常在系统启动时就开始运行,直到系统关闭时才终止。

守护进程不依赖于终端!!

当控制终端被关闭时,相应的进程都会被自动关闭。【比如咱们平常写了一个死循环程序,咱们不知道有ctrl+c的时候,应该如何关闭该进程?关闭终端窗口!】

这也就意味着关闭终端的同时也关闭了我们的程序。

但是对于守护进程来说,其生命周期守护需要突破这种限制,它从开始运行,直到整个系统关闭才会退出,所以守护进程不能依赖于终端。

创建流程

  1. 忽略信号 SIGPIPE SIGCHLD
  2. 保证自己不是组长:创建子进程,父进程直接退出;
  3. 在子进程中创建新会话;
  4. 打开/dev/null
  5. 通过dup2对标准输入/输出/错误的重定向;
  6. 关闭文件描述符
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ./Calserver 8080
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps -ajx | head -1 && ps -ajx | grep 8080
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1 18544 18544 18544 ?           -1 Ss    1001   0:00 ./Calserver 8080

从执行结果来看,我们可以看到1、该守护进程是以超级用户启动的(UID为0);2、没有控制终端(TTY为?);3、终端进程组ID为-1(该进程未和任何终端相关);4、守护进程的父进程为1516,即systemd(所有的守护进程的父进程)。

注意:

  1. /dev/null,该路径写入的数据会被自动丢弃;
  2. 因为子进程是没有和任何终端相关的,所以不可以用标准输入/输出/错误,否则会导致进程卡住。

setsid函数

头文件
	#include <unistd.h>
功能
	//首先内核会创建一个新的会话,并让该进程成为该会话的leader进程
	//同时伴随该session的建立,一个新的进程组也会被创建,同时该进程成为该进程组的组长
	//该进程此时还没有和任何控制终端关联。若需要则要另外调用tcsetpgrp
	//通过setsid可以让进程摆脱原会话的控制,摆脱原进程组的控制,摆脱原控制终端的控制
原型
	pid_t setsid(void);

在第二步我们调用了fork()函数来创建子进程再令父进程退出。由于在调用fork()函数时,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了,但原先的会话期、进程组和控制终端等并没有改变,因此,还不是真正意义上的独立。而setsid()函数能够使当前子进程完全独立出来,从而脱离所有其他进程和终端的控制。

dup2函数

头文件
	#include <unistd.h>
功能
    重定向文件描述符
原型
	int dup2(int oldfd, int newfd);

代码

#pragma once

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>

void MyDaemon()
{
    // 1.忽略信号 SIGPIPE SIGCHLD
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    // 2.保证自己不是组长
    // 2.1 父进程直接退出
    if (fork() > 0)
        exit(0);
    // 3. 在子进程中调用setsid,创建新会话
    setsid();
    // 4.打开文件黑洞
    int devnull = open("/dev/null", O_RDONLY | O_WRONLY);
    // 5.标准输入/输出/错误的重定向
    if(devnull > 0)
    {
        //对cin做重定向
        dup2(0, devnull);
        //对cout做重定向
        dup2(1, devnull);
        //对cerr做重定向
        dup2(2, devnull);
    }
    // 6.关闭文件描述符
    close(devnull);
}

关掉守护进程

netstat -ano 可以查看所有通信进程

// 找到被占用的指定端口号所对应的进程信息并呈现
sudo lsof -i:端口号
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ sudo lsof -i:8080
[sudo] password for yyq: 
COMMAND     PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
Calserver 13323  yyq    3u  IPv4 279245559      0t0  TCP *:webcache (LISTEN)

// 关掉守护进程
sudo kill pid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给大家介绍几个手机冷门但好用的小技巧

技巧一&#xff1a;拍照识别植物 手机的拍照识别植物功能是指在使用手机相机时&#xff0c;可以通过对植物进行拍照&#xff0c;并通过植物识别技术&#xff0c;获取植物的相关信息和资料。其主要优点如下&#xff1a; 方便实用&#xff1a;使用拍照识别植物功能&#xff0c;…

Small Tip: 怎么去Schedule一个Analysis for Office的workbook

workbook的query不能是本地的&#xff0c;也就是说不能是在包$Tmp里面的。这种的没办法在BO里面用SSO。也就没办法Schedule。 前提条件有&#xff1a; 1.BO和BW系统的SSO配置得OK。 如果没有SSO&#xff0c;那么每次打开workbook就会有一个要登录BW的弹窗&#xff0c;这样是…

从零开始学习Linux运维,成为IT领域翘楚(三)

文章目录 &#x1f525;Linux超级用户与伪用户&#x1f525;Linux文件基本属性&#x1f525;Linux权限字与权限操作 &#x1f525;Linux超级用户与伪用户 Linux下用户分为三类&#xff1a;超级用户、普通用户、伪用户 ⭐ 超级用户&#xff1a;用户名为root&#xff0c;具有一切…

初识 OPC

为什么需要OPC&#xff1f; 随着自动化的发展&#xff0c;工厂的自动化程度越来越高&#xff0c;面临着问题&#xff1a; 设备之间&#xff0c;设备与应用程序之间交互数据 不同产商设备/应用程序具有不同接口/通信协议&#xff0c;如何简单快速连接&#xff1f;采集的数据及…

【计算机网络】学习笔记:第四章 网络层【王道考研】更新中....

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

计算机组成原理4.2.2汉明码

编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式&#xff0c;确定增添几位&#xff0c;根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则&#xff1a;哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…

JUnit 5 使用教程 及 JUnit 4/5的差异

1. JUnit 5产生的原因 JDK 8在java中带来了迷人的功能,最值得注意的是lambda表达式 为了适应 Java 8 风格的编码和新的功能特性,JUnit 提供了JUnit 5 2. JUnit 5 架构 与 JUnit 4 相比,JUnit 5 由来自三个不同子项目的几个不同模块组成:JUnit 5 = JUnit Platform + JUni…

controlnet1.1模型和预处理器功能详解(各预处理器出稿对比及对应模型说明)

ControlNet 1.1 与 ControlNet 1.0 具有完全相同的体系结构,ControlNet 1.1 包括所有以前的模型&#xff0c;具有改进的稳健性和结果质量&#xff0c;且增加并细化了多个模型。 命名规范 项目名版本号标识基础模型版本功能名文件后缀名 control 官方总是以control为项目名&…

Java NIO(Java Non-Blocking IO:非阻塞式IO)(2)

1.NIO非阻塞网络编程原理分析 1>.NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel)关系梳理图: 说明: ①.当客户端连接时,会通过服务器端ServerSocketChannel得到/生成对应的SocketChannel; ②.通过register(Selector sel,int ops)…

SpringBoot 如何防御 CSRF 攻击

SpringBoot 如何防御 CSRF 攻击 CSRF 原理CSRF实践CSRF防御前后端不分离方案前后端分离方案 CSRF 就是跨域请求伪造&#xff0c;英文全称是 Cross Site Request Forgery。 这是一种非常常见的Web攻击方式&#xff0c;其实是很好防御的&#xff0c;但是由于经常被很多开发者忽略…

压缩HTML引用字体

内容简介 有些网站为了凸显某部分字体&#xff0c;而引入自定义字体&#xff0c;但由于自定义字体相对都比较大&#xff08;几M&#xff09;,导致页面加载缓慢&#xff1b;所以本文介绍三种压缩字体的方法&#xff0c;可根据项目情况自行选择。 压缩方法 1、利用Fontmin程序&a…

ETL工具 - Kettle 输入输出算子介绍

一、Kettle 输入输出算子介绍 上篇文章对 Kettle 进行了简单的介绍及做了个简单的案例&#xff0c;但是对 Kettle 的Step算子工具没有做过多的解释&#xff0c;本篇文章从输入输出算子工具开始进行介绍。 下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 介绍及基本使用 …

正点原直流有刷驱动板的硬件解说

这里写目录标题 H桥电流采集电路电源电压采集电路温度采集电路过流检测电路过流保护电路![请添加图片描述](https://img-blog.csdnimg.cn/fa130e17e23b471e8e27ae942e1ff125.png) H桥 因为光耦(EL0631)作用&#xff0c;PWM 引脚电平输入IN相反。 然后半桥芯片的逻辑表为&#x…

【Python】BeautifulSoup

一、什么是BeautifulSoup Beautiful Soup 简称 BS4&#xff08;其中 4 表示版本号&#xff09;是一个 Python 第三方库&#xff0c;它可以从 HTML 或 XML 文档中快速地提取指定的数据。 二、BS4下载安装 点击最下面的终端进如命令行界面 &#xff08;进入成功界面&#xff1a;&…

C++/Qt 小知识记录3

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识 QLineEdit限制输入大于0的正整数QLayout内清空已布局的WidgetWindows结束进程直接结束&#xff0c;子进程不响应结束事件正常结束&#xff0c;子进程响应结束事件 CMake关闭控制台Console实体与值对…

【网络编程】网络基础知识总结

文章目录 一、局域网与广域网二、协议2.1 协议的概念2.2 协议分层2.3 数据传输的条件 三、OSI七层模型四、TCP/IP五层&#xff08;四层&#xff09;模型五、网络传输5.1 预备知识——报头5.2 局域网通信原理5.3 以太网和令牌环网5.3 网络传输流程图5.3.1 同一网段的两台计算机的…

海岛旅行回忆总结(不定更)

文章目录 概述大辣甲岛外伶仃岛、东澳岛长洲、南丫岛下川岛 概述 喜欢大海&#xff0c;与海滩相比&#xff0c;海岛的空气更好、海水更靓、人更少、污染更少 海岛位置日期天气小结大辣甲岛惠州2017年7月29~30日台风前夕&#xff0c;云淡风轻&#xff0c;阳光猛烈开发程度低&…

分享2款CSS3母亲节主题寄语文字动画特效

目录 ❤️ 前言 第一款&#xff1a;妈妈您辛苦了&#xff01; 一、效果图 二、代码实现 第二款&#xff1a;Mothers Day&#xff01; 一、效果图 二、代码实现 ❤️ 祝福 ❤️ 前言 母亲节&#xff0c;在每年五月的第二个星期日&#xff0c;是用来感谢母亲的节日。…

SpringAOP

SpringAOP 一、AOP1. AOP简介1.1 AOP简介和作用1.2 AOP中的核心概念 2. AOP入门案例【重点】2.1 AOP入门案例思路分析2.2 AOP入门案例实现【第一步】导入aop相关坐标【第二步】定义dao接口与实现类【第三步】定义通知类&#xff0c;制作通知方法【第四步】定义切入点表达式、配…

阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器&#xff0c;3.2 GHz睿频&#xff0c;g8i实例采用阿里云全新CIPU架构&#xff0c;可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…