【Linux专栏】Linux进程间关系和守护进程

在这里插入图片描述

文章目录

  • 1、进程间关系
    • 1.1 进程组
    • 1.2 组长进程
  • 2、会话?
    • 2.1 查看会话
    • 2.2 创建会话
  • 3、控制终端
  • 4、作业控制
    • 4.1 前台/后台进程
  • 5、守护进程
    • 5.1 如何创建守护进程?
    • 5.2 杀掉守护进程

1、进程间关系

主要描述两个名称概念:即进程组和组长进程。

1.1 进程组

什么是进程组?通过名称可以看到它包含很多进程,所有进程在一个组内,当然名称虽然是进程组,其实在Linux中,单个进程也是有自己的组。首先,通过看一个进程在Linux中是如何描述的?
在这里插入图片描述

PPID: 表示该运行的进程所属的父进程ID信息,即该进程的父亲。
PID:表示该运行进程的唯一标识符。
PGID:表示改进程所属进程组的ID,(由于是单进程因此进程组ID就是自己的PID,也就是为什么说进程组中可以有一个进程。)
SID:表示会话ID信息
TTY:表示该进程所属于哪一个终端,(显示的是终端号,本质就是在/dev/pts下的一个文件)
UUID:表示是哪一个用户执行的该进程,即用户名,只不过Linux中是用数字描述的。

我们看到描述一个进程的信息有PPID、PID、PGID等,接下来要讲述的就是PGID?
首先来看一个指令,该指令是由3个相同的指令组合,用管道连接的 ,我们知道在Linux中一条运行的指令就是一个进程。
在这里插入图片描述
从图中可以看到启动了3个进程,他们同属于一个组,因为PGID都是393911,仔细观察看到该进程组ID就是第一个运行起来的进程PID。
总结就是:当多个进程在运行时候,他们有各自的PPID、PID,但是PGID是相同的,因为是一个进程组,并且规定进程组ID就是第一进程执行时的PID。
上面看到的是由多个进程组成的进程组,所描述的信息就是上面所展示的,那么只有一个进程运行的时候又是如何描述的?如下显示的:
在这里插入图片描述
上面就是单个进程运行时,他的进程组就是自己的PID,也符合:第一个进程运行的PID作为PGID。
看到多个进程和单个进程的进程组描述如上,那么当我们在一个进程中又创建了子进程,然后让父进程直接退出,此时进程又是如何描述的?如下:
在这里插入图片描述
可以看到当一开运行进程的时候,父进程在程序中设置的是延时5秒,此时进程有自己的PPID、PID、PGID,由于是单进程组成的进程组,所以是自己的PID,当5秒结束后,程序中紧接着创建子进程,并且让父进程直接退出,此时该进程就变为了孤儿进程,被1号进程领养,但所属的进程组ID是不变的,还是第一个进程运行的PID,只是PID变为了子进程的PID了。

总结:在多进程中实际上以进程组的关系执行的,进程组就是一个或多个进程的集合,一个进程组可以有多个进程,也可以只有一个进程。PGID就是第一运行进程的PID,同时只有当最后一个进程退了,该组才全部退出,与组长进程是否退出没有关系。

1.2 组长进程

通过上面的描述,显而易见组长进程就是在进程组中第一个运行的进程,对应的PGID就是该进程的PID。
查看对应列属性的数据指令:ps -eo 对应进程列属性

2、会话?

会话和上面的进程组有关系,即在一个会话中可以包含一个或者多个进程组,因此一个或多个进程组集合就是一个会话。

2.1 查看会话

在这里插入图片描述
通过上面的图可以看出,每创建一个终端登录界面,登录后就会有对应的SID,因此会话就可以理解为从用户登录该终端开始到该终端退出关闭,在该过程中所操作的所有事。通过SID,即会话ID来区分不同会话区。

2.2 创建会话

在看到会话所表示的区域后,我们自己如何创建新的会话呢?
即通过setseid函数创建会话。该函数使用前提就是不能让组长进程来创建会话。
#include <unistd.h>
/*
*功能:创建会话
*返回值:创建成功返回 SID, 失败返回-1 */
pid_t setsid(void);

为了不让创建的进程是组长进程,通常是在进程中创建子进程来创建会话。

3、控制终端

简单来说,控制终端就是用户在通过终端登录系统过后得到的一个shell进程,登陆后所在的终端就是该shell的控制终端。控制终端保存在PCB中的,因此在shell中启动的所有进程都属于该登录的终端。 每个进程的标准输入、输出、错误都会指向该控制终端。在理解控制终端后,它还和会话、进程组有这些关系:
①一个会话拥有一个控制终端,通常打开的首个会话进程打开终端后,该终端就是该会话的控制终端。
②和控制终端建立的会话的首进程叫控制进程。
③在一个会话中的多个进程组中可以被分为一个前台进程组和一个或多个后台进程组。控制终端的指令只能发送给前台进程组。

4、作业控制

什么是作业?每个学生都知道作业这件事,但这里的作业是指用户为了完成某件事而启动的进程。一个作业可以包含一个进程或者是进程组,进程之间相互协调。
作业控制?
谁控制?在Shell中分前后台来控制,控制的就是作业或者是进程组。一个前台作业可以是多个进程组,后台也可以是多个。Shell可以同时运行一个前台作业或多个作业前台作业,即为作业控制。

4.1 前台/后台进程

我们用户输入执行程序指令时大多数都是前台运行的,前台运行有个特点就是只有等前台运行结束后用户再输入指令才有用,才会被控制终端接收。
./exe:该方式运行的就是前台进程。
变为后台进程方式:./exe &
在同一个会话中,可以允许多个后台进程(组),但前台进程(组)只允许一个。
前后台进程的标志:看谁应该从标准输入中获取数据。明确的是只有前台进程才可以获取。
把后台变为前台:fg 进程名,也可以通过作业号进行移动。
前台变为后台:先停止前台进程(ctrl+z),在bg 进程名

5、守护进程

守护进程不受控制终端关闭的影响,而是长时间运行的。我们就是把在会话的中的进程组拿出来放在单独的放到独立的会话中,此时该进程组就是守护进程。
那么如何创建会话,前面说了通过setsid()函数,注意不能是组长进程。
既然不能是组长进程,我们在写程序的时候,主函数中就是父进程,第一个先运行的,即为组长进程,因此不能在主函数中创建会话,需要在子进程中创建会话。让父进程直接退出。此时就会想到孤儿进程,因此守护进程就是孤儿进程的一种特殊。

5.1 如何创建守护进程?

步骤:
①忽略信号。
②创建子进程,在其中创建会话。
③更改工作目录。
④重定向标准输入输出到/dev/null。

#pragma once#include<iostream>
#include<string>
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>//更改工作目录
const char *root="/";//根目录
const char *dev_null="/dev/null";void Demo(bool isChdir,bool isClose)
{//1、忽略可能引起程序错误的信号signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);//2、创建子进程if(fork()>0){exit(0);//父进程退出}//3、子进程中创建会话setsid();//4、查看是否更改CWDif(isChdir){chdir(root);//更改为根目录}//5、此时已经是守护进程了,不需要和用户的标准输入、输出、错误关联if(isClose){close(0);close(1);close(2);}else{//也可以重定向int fd=open(dev_null,O_RDWR);if(fd>0){//后者重定向到前者dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}}
}

通过调用编写的函数,把进程变为守护进程

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include "Demo.hpp"
int main()
{// sleep(5);// if(fork()>0)// {//     exit(1);// }// while(1)// {//     std::cout<<"child PPID:"<<getppid()<<" PID:"<<getpid()<<std::endl;//     sleep(1);// }//Demo(false, false);while (1){std::cout << "hello" << std::endl;sleep(1);}return 0;
}

5.2 杀掉守护进程

kill -9 PID

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

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

相关文章

电商物流管理优化:从网络重构到成本管控的全链路解析

大家好&#xff0c;我是沛哥儿。作为电商行业&#xff0c;我始终认为物流是电商体验的“最后一公里”&#xff0c;更是成本控制的核心战场。随着行业竞争加剧&#xff0c;如何通过物流网络优化实现降本增效&#xff0c;已成为电商企业的必修课。本文将从物流网络的各个环节切入…

ubuntu 更新华为源

1. 备份配置文件 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 2. 修改source.list 文件&#xff0c;将http://archive.ubuntu.com和http://security.ubuntu.com替换成http://repo.huaweicloud.com&#xff0c;可以参考如下命令&#xff1a; # 第一条指令 s…

CS016-4-unity ecs

【37】将系统转换为任务 Converting System to Job 【Unity6】使用DOTS制作RTS游戏|17小时完整版|CodeMonkey|【37】将系统转换为任务 Converting System to Job_哔哩哔哩_bilibili a. 将普通的方法&#xff0c;转化成job。第一个是写一个partial struct xxx&#xff1b;第二…

如何使用 React Hooks 替代类组件的生命周期方法?

文章目录 1. 引言2. useEffect 概述3. 模拟类组件的生命周期方法3.1 模拟 componentDidMount3.2 模拟 componentDidUpdate3.3 模拟 componentWillUnmount 4. 多个 useEffect 的使用5. 注意事项6. 总结 1. 引言 在 React 16.8 版本之前&#xff0c;开发者主要通过类组件&#x…

盒带自编教材《软件工程》目录

目录 前言 第1章 软件工程概述 1.1 软件概述 1.1.1 软件的定义 1.1.2 软件的特点 1.1.3 软件的分类 1.1.4 软件的发展 1.2 软件危机 1.2.1 什么是软件危机 1.2.2 产生的原因及解决途径 1.3 软件工程 1.3.1 软件工程定义 1.3.2 软件工程的研究内容 1.3.3 软件工程的目标和原则…

CAN通信协议传输数据,为什么喜欢低位在前高位在后?而RS485则更倾向高位在前低位在后?

CAN 通信协议通常采用低位在前&#xff08;小端字节序&#xff09;&#xff0c;而 RS - 485 本身没有固定要求高位在前或低位在后&#xff0c;其数据传输顺序更多取决于具体应用和上层协议。 CAN 通信协议低位在前的原因 硬件设计与实现角度 逻辑电路处理便捷&#xff1a;数…

NGINX 安全性:持续进化的防护能力,为您的应用保驾护航

在数字时代,网络安全的重要性不言而喻。任何暴露在互联网上的应用都可能成为攻击者的目标。作为互联网基础设施的关键组成部分,NGINX 不仅是高性能的 Web 服务器和反向代理,更在应用安全防护方面扮演着至关重要的角色。它就像您数字资产的“第一道防线”和“智能门禁”,凭借…

makefile细节说明

在 Makefile中&#xff0c;依赖关系的左右两部分有特定的名称&#xff1a; ​​左边部分&#xff08;冒号左侧&#xff09;​​ 称为 ​​目标&#xff08;Target&#xff09;​​ ​​右边部分&#xff08;冒号右侧&#xff09;​​ 称为 ​​依赖项&#xff08;Prerequisite…

Zephyr OS Nordic芯片的Flash 操作

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…

03、基础入门-SpringBoot的大时代背景

03、基础入门-SpringBoot的大时代背景 # Spring Boot的大时代背景 Spring Boot的出现和发展&#xff0c;与以下时代背景密切相关&#xff1a; ## 1. 微服务架构的兴起 ### 背景 随着互联网应用的复杂度增加&#xff0c;传统的单体架构在扩展性、维护性和团队协作方面遇到瓶…

ChromaDB 向量库优化技巧实战

chroma 一步步使用 安装 # 安装chromadb pip install chromadb,sentence_transformers# 不启动服务会出现sock.connect(sa)TimeoutError: timed out chroma run服务启动后&#xff0c;您将看到类似以下输出&#xff1a; 建立连接 部署完成后&#xff0c;需要建立与Chroma服…

全球泳装与沙滩装市场深度洞察:从功能性需求到可持续时尚的蜕变(2025-2031)

泳装与沙滩装作为水上活动与度假场景的核心服饰&#xff0c;正经历从单一功能性产品向“科技时尚可持续”融合的转型。根据QYResearch预测&#xff0c;2031年全球市场规模将达2512.4亿元人民币&#xff0c;年复合增长率&#xff08;CAGR&#xff09;4.0%&#xff08;2025-2031&…

WebRTC技术下的EasyRTC音视频实时通话SDK,助力车载通信打造安全高效的智能出行体验

一、方案背景​ 随着智能交通与车联网技术的飞速发展&#xff0c;车载通信在提升行车安全、优化驾驶体验以及实现智能交通管理等方面发挥着越来越重要的作用。传统的车载通信方式在实时性、稳定性以及多媒体交互能力上存在一定局限&#xff0c;难以满足现代车载场景日益复杂的…

主流数据库运维故障排查卡片式速查表与视觉图谱

主流数据库运维故障排查卡片式速查表与视觉图谱 本文件将主文档内容转化为模块化卡片结构&#xff0c;并补充数据库结构图、排查路径图、锁机制对比等视觉图谱&#xff0c;以便在演示、教学或现场排障中快速引用。 &#x1f4cc; 故障卡片速查&#xff1a;连接失败 数据库检查…

升级kafka4.0.0,无ZK版本

设备规划&#xff1a; 172.20.192.47 kafka-0 172.20.192.48 kafka-1 172.20.192.49 kafka-2 单机块7TB Nvme磁盘一共9块 # 格式化成GPT分区 sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme1n1 --script mklabel gpt sudo parted /dev/nvme2n1 --s…

Vue 学习随笔系列二十三 -- el-date-picker 组件

el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…

使用Python实现简单的人工智能聊天机器人

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…

[QMT量化交易小白入门]-五十四、核心资产ETF轮动目前年化只有74%了,在过滤掉当天止损,当天买入的之后

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读买入逻辑详解代码块作用解析止损逻辑详解代码…

实战解析MCP-使用本地的Qwen-2.5模型-AI协议的未来?

文章目录 目录 文章目录 前言 一、MCP是什么&#xff1f; 1.1MCP定义 1.2工作原理 二、为什么要MCP&#xff1f; 2.1 打破碎片化的困局 2.2 实时双向通信&#xff0c;提升交互效率 2.3 提高安全性与数据隐私保护 三、MCP 与 LangChain 的区别 3.1 目标定位不同 3.…

数据中心末端配电监控产品

精密配电介绍 数据中心配电系统图 交流220V和直流-48V、240V、336V(400V)对比 产品简介 AMC精密配电监控解决方案是针对精密配电柜&#xff08;列头柜&#xff09;的监控要求&#xff0c;设计开发一套完整的解决方案&#xff0c;包括交流&#xff08;AC 220V&#xff09;、直…