当前位置: 首页 > news >正文

守护进程Daemon

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

  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 sleepPPID   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 15703PPID   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 8080PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 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 SIGCHLDsignal(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

相关文章:

守护进程Daemon

进程组、对话期和控制终端关系 每个会话有且只有一个前台进程组&#xff0c;但会有0个或者多个后台进程组。产生在控制终端上的输入&#xff08;Input&#xff09;和信号&#xff08;Signal&#xff09;将发送给会话的前台进程组中的所有进程。对于输出&#xff08;Output&…...

学生成绩管理系统 002

学生成绩管理系统 *****************学生成绩管理系统***************** 1、成绩添加 2、成绩输出 3、成绩查询 4、成绩统计 5、成绩排名 6、成绩删除 7、成绩修改 8、成绩按学号排序 0、退出系统 ************************************************** 请选择功能:1 **********…...

换个花样玩C++(4)细聊C++的引用精妙之处

引用是C++引入的新语言特性。而且在日常工作开发过程中,经常会使用到引用,对于一些做系统架构的架构师而言,这也是不可或缺的一门基本功,我在工作中发现,很多人并没有搞清楚引用。因此我在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。…...

Linux安装helm

前言 运行环境&#xff1a;CentOS7.9 官方参考文档&#xff1a;官方文档 文章末尾附有一键安装脚本 下载安装包 github下载对应版本的安装包&#xff0c;下载地址 进入对应版本的下载页面&#xff0c;这里以v3.11.3为例 选择对应系统的安装包&#xff0c;这里以linux为例 …...

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…...

Orangepi Zero2 全志H616(DHT11温湿度检测)

最近在学习Linux应用和安卓开发过程中&#xff0c;打算把Linux实现的温湿度显示安卓app上&#xff0c;于是在此之前先基于Orangepi Zero2 全志H616下的wiringPi库对DHT11进行开发&#xff0c;本文主要记录开发过程的一些问题和细节&#xff0c;主要简单通过开启线程来接收温湿度…...

abbyy是什么软件

ABBYY&#xff0c;一款强大的OCR文字识别软件&#xff01; 在日常的工作中&#xff0c;我们常常需要提取PDF或图片上的大段文字&#xff0c;如果字数少的话&#xff0c;我们可以直接手打&#xff0c;但如果出现大篇幅的文字&#xff0c;那就有点头疼了。今天&#xff0c;我就向…...

软件测试技术(四)白盒测试

白盒测试 白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程&#xff0c;而不测试软件产品的功能&#xff0c;用于纠正软件系统在描述、表示和规格上的错误&#xff0c…...

Java基础语法(十二):try-catch块

目录 前言 一、try-catch是什么&#xff1f; 二、其他异常处理机制 总结 前言 Java 异常处理机制是 Java 程序设计中至关重要的一部分。它允许程序员像处理普通数据一样处理异常&#xff0c;并根据异常类型采取合适的措施。其中一个非常基本的异常处理机制是 try-catch 块…...

尚融宝25-投资列表展示以及实现充值功能

目录 一、展示投资列表 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 二、充值功能 &#xff08;一&#xff09;需求 1、需求描述 2、流程 &#xff08;二&#xff09;充值 1、后端 2、前端 &#xff08;三&…...

QML基础模型(Basic Model)

最基本的分离数据与显示的方法是使用Repeater元素。它被用于实例化一组元素项&#xff0c;并且很容易与一个用于填充用户界面的定位器相结合。 最基本的实现举例&#xff0c;repeater元素用于实现子元素的标号。每个子元素都拥有一个可以访问的属性index&#xff0c;用于区分不…...

如果ChatGPT写作论文,保姆及教程以及问题答疑

上次发表“如何用ChatGPT完成论文”后&#xff0c;许多捧场看官评论讨论&#xff0c;也有不少同学实操成功&#xff0c;但更多人寻求帮助。所以今天再整理一篇&#xff0c;把大家的疑问进行说明。 1. ChatGPT写的论文能否被检查出&#xff1f; 有同学反映将一段ChatGPT…...

机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…...

vulnhub靶场之bluemoon

1.信息收集 存活主机进行探测&#xff0c;发现主机192.168.239.176存活。 对主机192.168.239.176进行端口扫描&#xff0c;发现21、22、80端口 访问http://192.168.239.176&#xff0c;并查看源码未发现可利用的行为。 进行目录扫描发现可疑路径/hidden_text 浏览器访问h…...

VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter

前言&#xff1a; vtkPolyDataConnectivityFilter 使用过&#xff0c;但网上没有看到完事的教程&#xff1b;这里整理一下&#xff1b; 提取数据集中连通的多边形数据。 该类是一个滤波器&#xff0c;提取cell&#xff08;区域&#xff09; - 拥有公共点或者满足某个阈值 该类…...

scss、css样式中使用变量的方法;Vue动态改变css等样式文件中的变量

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.遇到一些样式 设置的值都是重复的不想重复写&#xff0c;想和js一样定义一个常量&#xff0c;然后直接引用这个常量。 2.想要在js中动态设置样式中的值&#xff0c;在 css、scss等样式表中直接使用。 二、原因及解…...

数据治理在学术上的发展史以及未来展望

数据治理是大数据领域中非常重要的一环&#xff0c;从早期的学术研究到如今的各大企业落地实践&#xff0c;经历了漫长的过程&#xff0c;数据治理的实践落地本身也是一场马拉松。 从百度学术通过精确关键词匹配&#xff0c;搜索中文期刊的“数据治理” 和外文期刊的“data gov…...

【搭建博客】宝塔面板部署Typecho博客,并发布上线访问

目录 前言 1.安装环境 2.下载Typecho 3.创建站点 4.访问Typecho 5.安装cpolar 6.远程访问Typecho 7.固定远程访问地址 8.配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&…...

【Spring篇】IOC相关内容

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、bean基础配置 1.bean基础配置(id与class) 2.bean的name属性 3.bean作用范围scope配置 二、bean实例化 1.构造方法实例化 2.分析Spring的错误信息 3.静态工厂实例化 4.实例工厂 5.FactoryBean 三…...

Python超矩形

文章目录 距离函数矩形分割 Rectangle是 scipy.spatial中封装的类&#xff0c;其构造函数只需输入最小值和最大值的数组即可&#xff0c;并且可通过内置的 volume方法计算广义的体积。 from scipy.spatial import Rectanglerec Rectangle((0,0), (5,5)) print(rec.maxes) …...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...