【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程

文章目录

  • 1.进程组
    • 1.1什么是进程组
    • 1.2组长进程
  • 2.会话
    • 2.1什么是会话
    • 2.2如何创建会话
  • 3.作业
    • 3.1什么是作业、作业控制?
    • 3.2作业号
    • 3.3常见作业状态
    • 3.4作业的切换
  • 4.守护进程
    • 4.1什么是守护进程?
    • 4.2如何创建守护进程
    • 4.3模拟实现daemon

1.进程组

1.1什么是进程组

之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外,还属于一个进程组。 进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。

每一个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PGID 类似于进程 ID, 同样是一个正整数, 可以存放在 pid_t 数据类型中。

$ ps -eo pid,pgid,ppid,comm | grep test
#结果如下
PID PGID PPID COMMAND
2830 2830 2259 test
# -e 选项表示 every 的意思, 表示输出每一个进程信息
# -o 选项以逗号操作符(,) 作为定界符, 可以指定要输出的列

1.2组长进程

每一个进程组都有一个组长进程。 组长进程的 ID 等于其进程组的 ID。 我们可以通过ps命令看到组长进程的现象。

[node@localhost code]$ ps -o pid,pgid,ppid,comm | cat
# 输出结果
PID PGID PPID COMMAND
2806 2806 2805 bash
2880 2880 2806 ps
2881 2880 2806 cat

从结果上看 ps 进程的 PID 和 PGID 相同, 那也就是说明 ps 进程是该进程组的组长进程, 该进程组包括 ps 和 cat 两个进程。

注意:

  • 进程组组长的作用: 进程组组长可以创建一个进程组或者创建该组中的进程。
  • 进程组的生命周期: 从进程组创建开始到其中最后一个进程离开为止,与其组长进程是否已经终止无关。

2.会话

2.1什么是会话

会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。

每一个会话也有一个会话 ID(SID) ,会话ID一般是一个会话中的第一个进程ID,一般是bash 。

QQ_1721985581104

当我们登录linux服务器时,系统会给我们分配一个终端文件,并且给这个终端文件关联一个bash进程,而更重要的是,这个bash进程也一定是一个进程组,此时分配的这个终端文件和关联的进程组就构建了一个会话。

那么什么是终端文件呢,你可以理解为就是xshell的一个窗口,这个终端文件存储在linux文件目录下的/dev/pts目录下,我们可以做一个实验来证明:

QQ_1721986579079

我们将“hello”写入到/dev/pts/1这个文件中就会发现,在另一个新打开的窗口中显示了出来。

并且每新打开一个窗口,系统中会新增一个bash进程,并且他们属于不同的会话(会话ID不同)。

QQ_1721986854636

所以我们已经证明了,一个新的窗口也是一个新的会话,每打开一个会话都会有新的终端文件和bash进程。

同一个会话中,可以允许同时存在多个进程组,但是任何时刻仅允许存在一个前台进程(组),可以允许一个或多个后台进程(组)。

当我们在bash中要求前台执行我们自己的进程时(./myprocess),bash就会自己转化为后台进程,前台进程就变为我们的进程,当我们的进程执行完后或者被强制退出后(ctrl + c),bash就会自动的切换为前台进程。

后台执行在后面加’&',比如 sleep 100 &

最明显的前后台区别是:谁应该从标准输入中获取数据

当会话关闭时, 会话中的进程组都会受到影响,取决于不同的系统。

windows在登录时也是相当于一个会话,当你觉得系统卡顿时,可以尝试“注销”,因为注销就相当于关闭当前会话,相应的会话中的所有进程组会关闭。

2.2如何创建会话

可以调用setseid函数来创建一个会话,前提是调用进程不能是一个进程组的组长

#include <unistd.h>
/*
*功能: 创建会话
*返回值: 创建成功返回 SID, 失败返回-1
*/
pid_t setsid(void);

调用该函数后:

  • 调用进程会变成新会话的会话首进程。 此时, 新会话中只有唯一的一个进程
  • 调用进程会变成进程组组长。 新进程组 ID 就是当前调用进程 ID 。
  • 该进程没有控制终端。 如果在调用setsid之前该进程存在控制终端, 则调用之后会切断联系。

注意:该函数调用的前提是调用进程不能是一个进程组的组长,所以在调用该函数前,我们需要先创建子进程,让子进程执行该函数。

即:

if(fork()>0) exit(0);setsid();

3.作业

3.1什么是作业、作业控制?

Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。

一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。

3.2作业号

放在后台执行的程序或命令称为后台命令, 可以在命令的后面加上’‘&’'符号,从而让Shell 识别这是一个后台命令, 后台命令不用等待该命令执行完成, 就可立即接收新的命令, 另外后台进程执行完后会返回一个作业号以及一个进程号(PID) 。

例如:

QQ_1721989391073

我们后台运行了两个作业,通过jobs命令可以查看运行的作业信息。

  • 参数-l:则显示作业的详细信息。
  • 参数-p:则只显示作业的 PID。

其中:

  • [1]:1表示作业号;
  • +:表示该作业号是默认作业;
  • -:表示该作业即将成为默认作业 ;
  • 无符号:表示其他作业;
  • Running:表示作业状态。

关于默认作业: 对于一个用户来说, 只能有一个默认作业(+),同时也只能有一个即将成为默认作业的作业(-) ,当默认作业退出后, 该作业会成为默认作业。

3.3常见作业状态

作业状态含义
正在运行【Running】后台作业,表示正在执行。
完成【Done】作业已完成,返回状态码为0。
完成并退出【Done(code)】作业已完成并退出,返回状态码为code(非0)。
已停止【Stopped】前台作业,当前被CTRL + Z挂起
已终止【Terminated】作业被终止

3.4作业的切换

我们可以通过fg 作业号 命令将后台运行的作业切换到前台运行。

同样的我们可以将暂停的作业放到后台运行,首先我们需要CTRL+Z将作业设置为暂停状态,然后利用bg 作业号命令将前台运行的作业切换到后台运行。

4.守护进程

4.1什么是守护进程?

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

我们知道用户登录的这种行为就会创建出一个会话,而如果我们的服务器进程运行在该会话上,当用户关闭这个会话时,运行在该会话上的进程就会收到影响,这肯定是我们不希望的。

所以我们一般需要将该服务器进程独立出来,即新创建一个会话出来,这样一来,我们的服务器进程就不会受到用户登陆注销影响了,此时这种进程就被称为守护进程

4.2如何创建守护进程

int daemon(int nochdir, int noclose);

参数说明:

  • 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
  • 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,否则不做处理。

4.3模拟实现daemon

  1. 设置文件掩码为0。
  2. fork后终止父进程,子进程创建新会话,所以守护进程是一种特殊的孤儿进程
  3. 忽略SIGCHLD信号。
  4. 再次fork,终止父进程,保持子进程不是会话首进程,从而保证后续不会再和其他终端相关联。
  5. 更改工作目录为根目录。
  6. 将标准输入、标准输出、标准错误重定向到/dev/null。

/dev/null,该文件是一个字符类文件,特点:从该文件读到的内容为空,向该文件写入的内容都会被系统丢弃。

void my_daemon(int nochdir, int noclose)
{//1、忽略不要的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);//2、fork后终止父进程,子进程创建新会话if (fork() > 0)exit(0);//3、setsidsetsid();//4、确认是否更改工作目录if (nochdir == 0){chdir("/");}//5、将标准输入、标准输出、标准错误重定向到/dev/null(可选的选项)if (noclose == 0){int fd = open("/dev/null", O_RDWR);if(fd>0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}else{close(0);close(1);close(2);}
}

说明:

  • 调用setsid创建新会话时,要求调用进程不能是进程组组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。
  • 我们一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。(该操作不是必须的)
  • 由于守护进程已经与终端去关联了,因此一般我们会将守护进程的标准输入、标准输出以及标准错误都重定向到/dev/null。

去成为你本应该成为的人,任何时候都不会太晚。 —乔治·艾略特
出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。

  • 我们一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。(该操作不是必须的)
  • 由于守护进程已经与终端去关联了,因此一般我们会将守护进程的标准输入、标准输出以及标准错误都重定向到/dev/null。

去成为你本应该成为的人,任何时候都不会太晚。 —乔治·艾略特

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机GPIO模式和应用

Push pull 推挽输出 定义&#xff1a;推挽输出是一种输出模式&#xff0c;其中引脚可以输出高电平或低电平&#xff0c;且两种电平状态下都具有较强的驱动能力。 特点&#xff1a; 无论输出高电平还是低电平&#xff0c;都有较强的电流驱动能力。 适用于驱动外部数字电路…

抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)

转载请注明出处&#xff01; 原文链接&#xff1a;https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为&#xff1a; 抖店&#xff08;抖音小店&#xff09;个体商家&#xff1b;抖店店群商家&#xff08;店群商家&#xff1a;指的是开了几十个抖…

Netty技术全解析:FixedLengthFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【代码故事】VSCode知名主题material-theme仓库代码清空

大家好&#xff0c;我是前端之虎陈随易。 这是我的个人网站 https://chensuiyi.me。 出大事了 看到了一篇前端社区开源扛把子 Anthony Fu 的帖子。 经过一番了解&#xff0c;出大事了&#xff01; 知名 VSCode 主题 material-theme 仓库清空了&#xff01; 连带着所有提交…

开源AI智能名片微信小程序:以人性洞察与资源优化为驱动的社群营销新策略

摘要&#xff1a;随着科技的飞速发展&#xff0c;特别是人工智能&#xff08;AI&#xff09;技术的广泛应用&#xff0c;传统营销模式正经历着前所未有的变革。本文旨在探讨开源AI智能名片微信小程序如何凭借其独特的功能特性&#xff0c;结合人性洞察、需求解决、资源优化以及…

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…

驰骋BPM RunSQL_Init SQL注入漏洞复现

0x01 产品简介 驰骋BPM系统由济南驰骋信息技术有限公司研发,具有悠久的历史和丰富的行业经验。其工作流引擎CCFlow自2003年开始研发,是国内知名的老牌工作流引擎,在BPM领域拥有广泛的研究群体与应用客户群。统提供.net与java两个版本,且两个版本的代码结构、数据库结构、设…

【学习笔记】Matlab和python双语言的学习(整数规划和0-1规划)

文章目录 前言一、整数规划和0-1规划二、典型示例1.背包问题2.指派问题 三、代码实现----Matlab1.Matlab 的 intlinprog 函数2.Matlab 代码背包问题指派问题 四、代码实现----python背包问题指派问题 总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频…

案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践

某省级妇幼保健院&#xff0c;是一所集医疗、保健、教学、科研、预防、康复于一体的省级三级甲等妇幼保健机构&#xff0c;专注于为全省妇女儿童提供全方位、高质量的医疗保健服务。医院拥有4个院区&#xff0c;总建筑面积10万平米&#xff0c;开放床位700张&#xff0c;年门诊…

【vue3|第21期】Vue3中Vue Router的push和replace方法详解

日期&#xff1a;2024年8月9日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

需求分析-系统架构师(四十六)

软件需求 软件需求&#xff1a;对系统在功能、行为、性能、设计约束等方面的期望。 分为 需求开发 和 需求管理 两大类。 需求分为 业务需求&#xff0c;用户需求&#xff0c;系统需求。 业务需求&#xff1a;企业或者客户对系统高层次的目标要求。 用户需求&#xff1a;用…

C#图片批量下载Demo

目录 效果 项目 代码 下载 效果 C#图片批量下载 项目 代码 using Aspose.Cells; using NLog; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.…

git强制推送代码教程

git强制推送代码教程 首先说明情况&#xff0c;我的代码remote了两个git库&#xff0c;现在想要推送到其中一个&#xff0c;但是版本不对&#xff0c;被拒绝&#xff0c;因此下面将进行强制推送 首先检查远程库都有哪些 git remote -v2. 检查当前的分支 git branch当前分支前…

八股总结----计算机网络

1.UDP头部格式 UDP的头部比较简单&#xff0c;只有8个字节&#xff0c;这也是为什么UDP不能像TCP那样实现可靠传输的原因。源端口和目标端口表示数据传输的来源和去向&#xff0c;包长度表示数据报文的总长度&#xff08;包含了头部和数据部分&#xff09;&#xff0c;方便接收…

stm32程序调试方式(OLED显示屏调试以及Keil调试模式)

文章目录 前言一、调试的方式二、OLED显示屏调试2.1 OLED简介2.2 OLED硬件电路2.3 OLED驱动函数介绍2.4 OLED显示屏应用案例代码 三、Keil调试模式总结 前言 提示&#xff1a;本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔记&#xff0c;旨在学习记录&#xff0c;…

基于GeoTools使用JavaFx进行矢量数据可视化实战

目录 前言 一、JavaFx展示原理说明 二、GeoTools的Maven依赖问题 三、引入Geotools相关的资源包 四、创建JavaFx的Canvas实例 五、JavaFx的Scene和Node的绑定 六、总结 前言 众所周知&#xff0c;JavaFx是Java继Swing之后的又一款用于桌面应用的开发利器。当然&#xff0…

9.C基础_指针与数组

数组指针&#xff08;一维数组&#xff09; 数组指针就是" 数组的指针 "&#xff0c;它是一个指向数组首地址的指针变量。 1、数组名的含义 对于一维数组&#xff0c;数组名就是一个指针&#xff0c;指向数组的首地址。 基于如下代码进行分析&#xff1a; int a…

语言模型-神经网络模型(二)

神经网络模型语言模型 神经网络模型神经网络的分类神经网络模型和Ngram对比应用一-话者分离对比优劣 应用二-数字归一化应用三-文本打标 神经网络模型 释义&#xff1a; 与ngram模型相似使用&#xff0c;前n个词预测下一个词&#xff0c;输出在字表上的概率分布&#xff1b;过…

如何设置 Visual Studio Code 的滚轮缩放功能

Visual Studio Code (VSCode) 是一个强大的代码编辑器&#xff0c;提供了许多便捷的功能来提高开发效率。其中之一就是通过滚轮缩放字体大小。以下是详细的设置步骤&#xff1a; 步骤 1&#xff1a;打开设置页面 首先&#xff0c;启动 Visual Studio Code。在左上角点击 “文…

【机器学习基础】线性回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…