Linux高阶——1027—进程间关系相关

本章节介绍,进程间的各种关系:亲缘关系,终端进程,进程组,会话,孤儿进程,守护进程

1、亲缘关系

Linux或unix操作系统,进程间具备亲缘关系,分为强亲缘与弱亲缘

强亲缘:父进程负责创建,继承数据,并且回收

弱亲缘:只有继承关系

ps ajx——查看进程关系

2、终端进程

如果在bash终端内执行程序,例如./app,这个app进程是终端子进程,是被终端创建的

是bash进程调用fork函数,创建出一个终端子进程,这个子进程将app的用户空间重载

这种终端的进程,可以称作终端进程

终端进程受终端限制,如果终端关闭,会杀死进程,因此需要了解如何将进程和终端分离

3、进程组关系

进程组知识点

操作系统为了管理多进程,将进程编为进程组关系,每个进程组由一个组长进程和若干个组员进程构成

终端子进程被创建后都是组长进程,进程组里可以没有组长

每个组长都有一个组id,PGID——如果某个进程的PID等于PGID,那么这个进程为组长

进程组的生命周期比里面组成员的生命周期长——进程组释放与某个特定的进程无关,当组成员全部结束或转移,当进程组为空时,系统才释放组

就近原则——如果组长进程创建子进程,子进程默认与父进程一组,并为父进程的组员

进程组关系与亲缘关系没有必然联系——不能确定组员一定是子进程

进程组关系与亲缘关系没有必然联系——即使子进程转移到其他组,或子进程变为组长,亲缘关系仍然不变,子进程结束后依旧由父进程回收

进程id函数

getpid()——获取进程id

getppid()——获取父进程id

getpgrp()——获取进程组id

setpgid()——创建进程组

setpgid(getpid(),getpid())——让某个进程变成组长进程,组长进程无法创建,只有组员进程可以

setpgid(getpid(),gpid)——将某个组成员转移到其他组中

组长无法转移到其他进程组内,但是组员可以

想要转移到其他组中——1、必须对目标组拥有权限—2、目标组必须存在

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>int main()
{pid_t pid;int i;for(i=0;i<3;i++){pid=fork();if(pid==0){break;}}if(pid>0){printf("parent pid %d,pgid %d\n",getpid(),getpgrp());while(1)sleep(1);}else if(pid==0){if(i==2){printf("child pid %d,pgid %d\n",getpid(),getpgrp());sleep(5);setpgid(getpid(),getpid());printf("child pid %d,pgid %d\n",getpid(),getpgrp());while(1)sleep(1);}printf("child pid %d,pgid %d\n",getpid(),getpgrp());while(1)sleep(1);}else{perror("faild");exit(0);}return 0;
}

父进程id——3478,组id为3478

子进程id——3479,3480,3481,组id为父进程id3478

当休眠5秒后,将id为3481的子进程改为组长,创建了组id为3481的组

4、进程会话关系

一般当终端管理终端下的进程,会组成一个会话,分为会话发起者和会话参与者

如果bash进程是会话发起者,设定终端进程为一个会话参与者,由这个终端进程创建出的多个终端子进程也属于会话参与者

会话发起者的标志——pid==pgid==sid

bash为会话发起者,因此bash的pid和pgid和sid都为相同的,均为1000

终端进程为bash进程的会话参与者,因此sid与bash相同,为1000,设进程pid和组id为3000

将终端子进程1的pid设为3001,gid与父进程相同,为3000,sid为会话id1000

当会话发起者退出,系统以组为单位杀死会话参与者,按进程组杀死

让进程创建新的进程组,可以避免被终端退出杀死,即可脱离终端——实现终端与进程分离

setsid()——创建新会话

setsid包含两个步骤,第一个步骤是创建组,第二个步骤是申请会话

getsid(getpid)——获取会话id

终端进程不能再创建进程组,不能转移到其他组,也不能创建会话,因此终端进程一定会被杀死

5、孤儿进程

父进程先于子进程退出,子进程变成孤儿进程

托管进程不会控制子进程,只负责回收

孤儿进程会影响新的进程创建,而且孤儿进程为存活状态,存在很多不确定因素,需要早处理

孤儿进程的危害是弹性的,取决于孤儿进程的任务

 假如最开始,托管进程id为1000,父进程id为3000,子进程的id为3001,父进程id为3000

当父进程异常结束,子进程会被寄存给托管进程,子进程的ppid会与托管进程相同,变为1000

孤儿进程危害很大,因此要进行孤儿进程检测,发现孤儿进程,立即让其退出

孤儿进程的检测可以使用管道,父进程作为管道写端,子进程都是读端,写端退出,读端读管道读到0,子进程退出即可,利用管道实现孤儿的检测机制

检测孤儿进程的代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<signal.h>
#include<pthread.h>
#include<sys/fcntl.h>int main()
{pid_t pid;int i;int fds[2];pipe(fds);int flag;int len;for(i=0;i<3;i++){   pid=fork();if(pid==0){break;}}   if(pid>0){   int timeout=8;close(fds[0]);while(timeout--){printf("parent running\n");sleep(1);}close(fds[1]);exit(0);}   else if(pid==0){   char buf[1024];close(fds[1]);flag=fcntl(fds[0],F_GETFL);flag=O_NONBLOCK;fcntl(fds[0],F_SETFL,flag);while(1){printf("child pid %d,running...\n",getpid());if((len=read(fds[0],buf,sizeof(buf)))==0){printf("child id %d check parent exit,child exit...\n",i);close(fds[0]);exit(0);}if(len==-1){if(errno==EAGAIN){}}sleep(1);}}else{perror("faild");exit(0);}return 0;
}

6、守护进程(daemon process精灵进程/守护进程)

后台服务进程,不占用前台资源,后台服务一般不与用户直接交互,与用户交互的是前台程序,UI进程,前台程序

1、常规进程生命周期随用户使用持续,守护进程生命周期随系统持续,开机启动关机结束

2、守护进程的任务,保障系统稳定,如果是软件的守护进程,为软件提供支持与服务

3、守护进程的工作模式是低消耗模式(间隔执行)(定时执行)(条件触发)

守护进程也是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力

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

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

相关文章

VoxelMap论文翻译

文章目录 前言一、介绍二. 相关工作三. 方法论A. 概率平面表示1) 点 W p i {}^{W} p_{i} Wpi​ 的不确定性&#xff1a;2) 平面不确定性建模&#xff1a; B. 粗到细高效体素地图构建1) 动机&#xff1a;2) 体素地图构建&#xff1a;3) 体素地图更新&#xff1a; C. 点到平面配…

使用LangChain控制大模型的输出——解析器Parser

LangChain框架中有两个好用的工具&#xff1a; 提示词模板(PromptTemplate)用于指定LLM的输入&#xff0c;解析器(Parser)来正确解释LLM给出的输出 即&#xff1a; 提示词模板(PromptTemplate)&#xff1a;用于格式化地接受输入string变量&#xff0c;作为完整的提示词。 如 给…

数据结构与算法实验练习(二)(排序及线性表的应用)

数据结构与算法分析课下实验练习&#xff0c;现记录一下解答过程&#xff0c;欢迎大家批评指正。 声明&#xff1a;本题目来源于西安交通大学电信学院原盛老师&#xff0c;任何单位或个人在使用、转载或引用本题目时&#xff0c;请务必标明出处为“西安交通大学电信学院原盛老…

关于回溯与分支限界的一些介绍

这篇文章将介绍回溯算法与分支限界算法的有关概念、具体应用及代码等内容。 一、回溯法 1.1 概念 回溯法是一种试探法&#xff0c;所以它也叫试探算法。它尝试构建问题的解&#xff0c;并且在发现解不满足条件的时候撤销选择&#xff08;即“回溯”&#xff09;&#xff0c;…

day05-Filebeat扩展

Filebeat对接ES加密集群 #查看集群状态 [09:22:25 rootelk1:~]#curl 10.0.0.91:9200/_cat/nodes -u elastic:1234561.编写配置文件 [09:52:06 rootelk3:/etc/filebeat]#vim 12-log-to-es_tls.yamlfilebeat.inputs: - type: logpaths:- /var/log/nginx/access.log*json.keys_un…

Vue全栈开发旅游网项目(3)-Vue路由配置

1. 配置路由 1.1 导入路由工具 文件地址&#xff1a;src\router\index.js import { createRouter, createWebHistory } from vue-router//导入配置路由的工具 import HomeView from ../views/HomeView.vue//导入组件const router createRouter({//创建路由对象history: cre…

代随(136):图论dfs——邻接矩阵

题干&#xff1a; 代码&#xff1a; #include <iostream> #include <vector> using namespace std;vector<vector<int>>res; vector<int>path;void dfs(vector<vector<int>>&graph, int x, int n) {if(x n){res.push_back(pat…

精选录屏软件大赏:满足不同场景需求的录制利器

现在是互联网的世界&#xff0c;所以很多时候学习、工作我们都离不开电脑。在我们通过互联网查看网课、开网络会议的时候是不是会因为速度太快而来不及记录&#xff1f;那我推荐使用一些windows录屏软件来记录所有重点&#xff0c;方便我们后期复盘。 1.FOXIT录屏大师 链接&a…

【python】OpenCV—findContours(4.5)

文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 输入图片&#xff0c;计算出图片中的目标到相机间的距离 2、原理分析 用最简单的三角形相似性 已知参数&#xff0c;物体的宽度 W W W&#xff0c;物体到相机的距离 D D D&#xff0…

【华为HCIP实战课程二十八】中间到中间系统协议IS-IS邻居关系排错,网络工程师

一、ISIS邻居关系条件 1、同一层次(比如Level-2路由器不能和Level-1路由器形成邻居关系) 2、同一区域(L1必须同一区域) 3、同一网段 R1和R2之间分别配置如下IP地址和掩码: R1 的接口S1/0/0掩码为/24 R2的接口S1/0/0配置成掩码/28: 此时R1和R2依然可以建立ISIS邻居关系…

文件操作和 IO(一):文件基础知识 文件系统操作 => File类

目录 1. 什么是文件 1.1 概念 1.2 硬盘, 内存, 寄存器之间的区别 1.3 机械硬盘和固态硬盘 2. 文件路径 2.1 绝对路径 2.2 相对路径 3. 文件分类 4. File 类 4.1 属性 4.2 构造方法 4.3 方法 1. 什么是文件 1.1 概念 狭义上的文件: 保存在硬盘上的文件广义的上的文…

Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域

在之前的 3.10 里&#xff0c; Flutter 的 Impeller 在 iOS 上支持了 P3 广色域图像渲染&#xff0c;但是当时也仅仅是当具有广色域图像或渐变时&#xff0c;Impeller 才会在 iOS 上显示 P3 的广色域的颜色&#xff0c;而如果你使用的是 Color API&#xff0c;会发现使用的还是…

web自动化测试平台开发之核心执行器

web自动化测试平台开发之核心执行器 一、如何从自动化框架到核心执行器二、核心执行器框架逻辑梳理三、核心执行器利用命令驱动执行 一、如何从自动化框架到核心执行器 脚本:底层用了三个内容:pythonpytestselenium&#xff0c;线性脚本&#xff0c;只是单纯的把功能测试用例转…

Rust 力扣 - 2090. 半径为 k 的子数组平均值

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 半径为 k 的子数组平均值 等价于 子数组长度为2 * k 1的总和 除于 2 * k 1 我们遍历长度为2 * k 1的窗口&#xff0c;我们只需要记录窗口内的平均值即可 题解代码 impl Solution {pub fn get_averages(num…

直接内存、死锁、方法句柄

直接内存 1. 不是虚拟机运行时数据区的一部分&#xff0c;也不是《Java虚拟机规范》中定义的内存区域 2. 直接内存是在Java堆外、直接向系统申请的内存区间 3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 4. 通常&#xff0c;访问直接内存的速度会优于Java堆&am…

C++《list》

在本篇当中我们将学习STL中的list&#xff0c;在此list就是我们之前在数据结构学习过的链表&#xff0c;在本篇中我们要来了解list当中的成员函数该如何使用&#xff0c;由于list各个函数的接口和之前学习过的vector类型&#xff0c;因此在学习list的使用就较为轻松。在lis篇章…

【牛客刷题实战】二叉树遍历

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 牛客题目&#xff1a; 二叉树遍历 题目描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&…

vmvare启动freebsd操作系统密码忘记了怎么办?

本章教程,主要介绍,通过vmvare安装的freebsd操作系统,密码忘记了,如何重置密码。 一、重启虚拟机 在重启过程中,按键盘中是数字2,进入单用户模式。 二、进入到shell界面 在出现“Enter full pathname of shell or RETURN for /bin/sh:”直接按回车键。 三、输入命令 mou…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下&#xff0c;提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后&#xff0c;把上表中的单位自动带入 那就要用到VLOOKUP函数&#xff0c;获取第2个表第1列的值后去第1个表的第1列匹配&#xff0c;匹配到后得到行数值&#xff0c;把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…