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.xdnf.cn/news/2079.html

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

相关文章

leetcode动态规划(二十三)-打家劫舍III

题目 337.打家劫舍III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树…

(七)Python运算符和优先级

一、算数运算符 算数运算符&#xff0c;如下表所示&#xff1a; x1 y2 z3 # 加法运算 axy print(a,a) # 减法运算 by-x print(b,b) # 乘法运算 cy*z print(c,c) # 除法运算 dz/y print(d,d) # 取模运算 ez%y print(e,e) # 幂运算 fy**z print(f,f) 输出结果&#xff1a; 二…

echarts地图,柱状图,折线图实战

1.地图 <template><div style"height: 100%;" class"cantainerBox"><div class"top"><div class"leftTop"><span class"firstSpan">推广进度</span><div>省份选择&#xff1a;&l…

JAVA语言多态和动态语言实现原理

JAVA语言多态和动态语言实现原理 前言invoke指令invokestaticinvokespecialinvokevirtualinvokeintefaceinvokedynamicLambda 总结 前言 我们编码java文件&#xff0c;javac编译class文件&#xff0c;java运行class&#xff0c;JVM执行main方法&#xff0c;加载链接初始化对应…

技术星河中的璀璨灯塔 —— 青云交的非凡成长之路

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Chromium127编译指南 Linux篇 - 额外环境配置(五)

引言 在成功获取 Chromium 源代码后&#xff0c;接下来我们需要配置适当的编译环境&#xff0c;以便顺利完成开发工作。本文将详细介绍如何设置 Python 和相关的开发工具&#xff0c;以确保编译过程无碍进行。这些配置步骤是开发 Chromium 的必要准备&#xff0c;确保环境设置…

基于华为atlas环境下的OpenPose人体关键点检测的人员跨越、坐立检测

整体思路&#xff1a; 收集数据集&#xff0c;数据集中包含3种类型的数据&#xff0c;分别是跨越、坐立、其他&#xff08;站立、睡着等等&#xff09;。3种类型的数据样本量持平。 首先基于OpenPose进行人体关键点的检测&#xff0c;得到人体的18个关键点。然后基于该算法将…

ubuntu20.04 加固方案-设置限制su命令用户组

一、编辑/etc/pam.d/su配置文件 打开终端。 使用文本编辑器&#xff08;如vim&#xff09;编辑/etc/pam.d/su文件。 vim /etc/pam.d/su 二、添加配置参数 在打开的配置文件的中&#xff0c;添加以下参数&#xff1a; auth required pam_wheel.so 创建 wheel 组 并添加用户 …

迅为itop-3568开发板AMP双系统使用手册之烧写AMP镜像

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

2024 年最佳解压缩软件免费下载推荐

在如今的信息时代&#xff0c;解压缩软件对于处理各种压缩文件至关重要。随着互联网的飞速发展&#xff0c;我们在日常工作和生活中会接触到大量的文件&#xff0c;而很多时候这些文件会以压缩的形式进行传输和存储。 对于个人用户而言&#xff0c;解压缩软件能够帮助我们轻松…

MySQL数据库之存储过程的创建与应用

存储过程 procedure 一.存储过程 作用&#xff1a;将经常使用的功能写成存储过程&#xff0c;方便后续重复使用。 二.创建存储过程 三.调用存储过程 call在计算机中是调用的意思 案例1&#xff1a;查看MySQL用户数 如上图所示&#xff0c;这是查看MySQL数据库中的user个数…

JAVA:数据库(mysql)编程初步学习\JDBC(附带项目文件)

给入门的同学初步了解JDBC&#xff0c;本人学疏才浅也希望可以给新人启发&#xff0c;编程的函数比较简单没有用更多库&#xff0c;方便给新人一个舒适的理解 tips&#xff1a;附带编程全套的代码&#xff0c;欢迎大家自由使用,仅供学习&#xff01; &#xff08;文件代码几千…

网页上视频没有提供下载权限怎么办?

以腾讯会议录屏没有提供下载权限为例&#xff0c;该怎么办呢&#xff1f; 最好的办法就是找到管理员&#xff0c;开启下载权限。如果找不到呢&#xff0c;那就用这个办法下载。 1.打开Microsoft Edge浏览器的扩展 2.搜索“视频下载”&#xff0c;选择“视频下载Pro” 3.点击“…

第15课 算法(下)

掌握冒泡排序、选择排序、插入排序、顺序查找、对分查找的的基本原理&#xff0c;并能使用这些算法编写简单的Python程序。 一、冒泡排序 1、冒泡排序的概念 冒泡排序是最简单的排序算法&#xff0c;是在一列数据中把较大&#xff08;或较小&#xff09;的数据逐次向右推移的…

USB摄像头使用V4L2采集图像\视频

背景 V4L2&#xff08;Video for Linux Two&#xff09;是Linux内核自带的一部分&#xff0c;专门用于处理视频设备的管理和控制。‌ V4L2框架提供了统一的API和抽象层&#xff0c;使得开发者可以编写通用的视频驱动程序&#xff0c;同时使用户空间的应用程序能够轻松地访问和…

栈和队列(三)

队列的链式存储表示和实现 链队的类型定义 typedef struct qnode{char data;struct qnode *next; }qnode,*queneptr;typedef struct{queneptr front;queneptr rear; }linkqueue; typedef struct qnode{}&#xff1a; 定义了一个名为qnode的结构体。结构体成员包括&#xff1a…

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

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

设计模式之结构型模式---装饰器模式

目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

SQL,力扣题目1709,访问日期之间最大的空档期

一、力扣链接 LeetCode_1709 二、题目描述 表&#xff1a; UserVisits ------------------- | Column Name | Type | ------------------- | user_id | int | | visit_date | date | ------------------- 该表没有主键&#xff0c;它可能有重复的行 该表包含用户访问…

极市平台 | NeurIPS 2024|浙大/微信/清华提出:彻底解决扩散模型反演问题

本文来源公众号“极市平台”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;NeurIPS 2024&#xff5c;浙大/微信/清华提出&#xff1a;彻底解决扩散模型反演问题 极市导读 本文介绍了浙江大学、微信和清华大学联合提出的BELM算法…