linux高级系统编程之进程
进程
一个正在进行的程序
并行与并发
并行:执行的程序在不同CPU上同时执行
并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的
单道与多道
单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空闲状态
多道程序设计:在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行
进程控制块(PCB)
进程运行时,内核为每个进程分配一个PCB(进程控制块),维护进程相关的信息,linux内核的进程控制块是task_struct结构体
task_struct结构体
在 /usr/src/linux-headers-xxx/include/linux/sched.h 文件中可以查看task_struct 结构体定义
其内部成员有很多如:进程id:语言使用pid_t的类型表示,其实就是一个非负整数进程的状态:有就绪,运行,挂起,停止等状态
在内核中![]()
进程号
当前进程的id就是进程号,由系统分配
每个进程都由一个进程号来标识,其类型为pid_t,进程号的范围:0~32767
进程号总是唯一的,但进程号可以重用,当一个进程终止后,其进程号就可以再次使用了
进程号为0和1的进程由内核创建
进程号为0的进程通常是调度进程,常被称为交换进程,进程号为1的进程通常是init进程
除调度进程(0号进程)外,在linux下面所有的进程都是由init(1号进程)进程直接或间接创建的
进程号(PID)
标识进程一个非负整型数
对应函数:
pid_t getpid() 获取当前进程的进程号
进程组号(PGID)
多个进程在同一个组中,该组就是进程组
该组中第一个进程为组长进程,该组长进程的进程id就是该进程组id
由进程A开启的子进程默认进程A为同组进程,此时A就是组长进程
对应函数;
pid_t getpgid(int pid) 获取指定进程所在的进程组号
父进程号(PPID)
由进程A开启进程B,此时进程A就是进程B的父进程,进程B就是进程A的子进程
对应函数:
pid_t getppid() 获取当前进程的父进程号
当进程A比进程B先销毁时,此时进程B就是孤儿进程,由1进程充当其父进程
扩展
命令:ps
作用:查看进程状态
参数:
-a 显示终端上的所有进程,包括其他用户的进程
-u 显示进程的详细状态
-x 显示没有控制终端的进程
-w 显示加宽,以便显示更多的信息
-r 只显示正在运行的进程
ps -aux:显示当前用户在运行到的进程信息
ps -ajx:显示正在运行的相关联进程信息(包含父进程id(ppid),组id(pdid))
显示信息中STAT参数含义
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程S(大写 ) 处于休眠状态T 停止或被追踪Z 僵尸进程W 进入内存交换(从内核 2.6 开始无效)X 死掉的进程< 高优先级N 低优先级s 包含子进程l 表示线程加锁+ 位于前台的进程组
fork函数
作用:创建进程
语法:
pid_t fork();
返回值:
如果在子进程中就是0,如果在父进程中就是创建的子进程id,-1创建失败
fork失败的两个主要原因是;
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN
2)系统内存不足,这时errno的值被设置为ENOM
注意:
1,子进程会从fork函数后开始执行
2,子进程共享父进程所有内容,不包括进程号,父进程号等
使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间
地址空间:包括进程上下文,进程堆栈,打开的文件描述符,信号控制设定,进程优先级,进程组号等
子进程所独有的只有它的进程号,计时器等
此外,使用fork函数的代价是很大的
3,谁创建谁回收
进程状态
三状态:就绪态 执行态 等待态
五状态:新建态 终止态 运行态 就绪态 阻塞态
注意:
阻塞态在其他语言中进行细分又可以分为阻塞态与休眠态
休眠态又可以分为有限期休眠与无限期休眠
休眠状态下不会抢夺CPU执行权
进程资源的回收
每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存资源等,但是任然为其保留一定的信息,这些信息主要指的是进程控制块的信息(包括进程号,退出状态,运行时间等);
回收原则:谁创建谁回收(父进程回收子进程资源)
wait函数
作用:回收进程资源
头文件:
#include <sys/types.h>
#include <sys/wait.h>
语法:
pid_t wait(int *status);//阻塞
功能:
等待任意一个子进程结束,如果任意一个子进程结束了,此函数会回收该子进程的资源
参数:
status:进程退出时的状态信息
返回值:
成功:已经结束子进程的进程号
失败:-1
注意:
1,会阻塞当前进程,知道回收一个子进程
2,因为谁创建谁回收的原则,所以该函数在父进程中调用
exit函数与_exit函数
作用:退出当前进程
exit函数与_exit函数的区别?
exit函数属于库函数,_exit函数属于系统调用
exit函数所需头文件#include<stdlib.h>,_exit函数所需头文件#include<unistd.h>
exit函数为 void exit(int status) ,_exit函数 void -exit(int status);
两者参数一致:
退出状态,0,正常退出,非0异常退出
注意:
退出状态码取值区间:0~255
WIFEXITED(status)与WEXITSTATUS(status)
作用:
WIFEXITED:获取进程退出时状态
WEXITSTSTUS:获取进程退出时状态码
语法:
WIFEXITED(status)
WEXITSTATUS(status)
waitpid函数
作用:回收进程
头文件:
#include<sys/types.h>
#include<sys/wait.h>
语法:
pid_t waitpid(pid_t pid,int *status,int options);
功能:
等待子进程终止,如果子进程终止了,此函数会回收子进程的资源
参数:
pid: 参数 pid 的值有以下几种类型:
pid>0 等待进程ID等于pid的子进程
pid=0 等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会等待它
pid=-1等待任一此时waitpid和wait作用一样
pid<-1 等待指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值
status:进程退出时的状态信息,和wait()用法一样
option:option提供了一些额外的选项来控制waitpid()
0:同wait(),阻塞父进程,等待子进程退出
WNOHANG:没有任何已经结束的子进程,则立即返回(非阻塞)
WUNTRACED:如果子进程暂停了则此函数马上返回,并且不予以理会子进程的结束状态
返回值:
1,当正常返回的时候,waitpid()返回收集到的已经回收子进程的进程号
2,如果设置了选项WNOHANG,而调用中waitpid()还有子进程在运行,且没有子进程退出,返回0,父进程的所有子进程都已经退出了返回-1,返回>0表示等到一个子进程退出
3,如果调用中出错,则返回-1,这时error会被设置成相应的值以指示错误所在
atexit函数
作用:进程在退出前可以用atexit函数注册退出处理函数
注意:
1,一个进程可以登记最多32个函数,这些函数将由exit自动调用,我们称这些函数为终止处理程序,用atexit函数来登记这些函数
2,以登记这些函数的相反顺序调用他们,同一函数如登记多次,则也会被调用多次
3,执行注册的函数依据是当前子进程
语法:
int atexit (void (*__func)(void))
僵尸进程
子进程退出,父进程没有回收子进程资源,子进程为僵尸进程(有害)
子进程的PID被占用,系统的PID是有数量限制
孤儿进程
父进程先结束,子进程为孤儿进程(无害)
孤儿进程被1号进程接管(当孤儿进程结束时,1号进程负责回收其资源)
守护进程
守护进程是在后台独立运行、脱离控制终端且周期性执行任务或等待处理事件的特殊进程,于系统启动时自动开启并持续至系统关闭,它在系统服务支持(如 httpd 提供 Web 服务)、资源管理(如 syslogd 收集日志)、任务调度(如 cron 按计划执行命令)等多方面发挥关键作用,在 Linux 中创建时需先通过 fork () 创建子进程,父进程退出后子进程进一步执行后续设置步骤以成为守护进程并稳定运行
终端
终端:是与计算机系统相连的一种输入输出设备
在UNIX系统中,用户通过终端登录后得到一个shell进程,这个终端成为shell进程的控制终端,进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由shell进程启动的其他进程的控制终端也是这个终端
作用 : 获取当前进程所属终端名称#include <unistd.h>char *ttyname(int fd);功能:由文件描述符查出对应的文件名参数: fd: 文件描述符返回值:成功:终端名失败: NULL
进程组
代表一个或多个进程的集合
每个进程都有对应的进程组
进程组ID为当前进程中的第一进程ID
如果一个进程ID和组ID相同,那么这个进程就是组长进程
当父进程创建子进程的时候,默认子进程与父进程属于同一进程组
shell进程启动的进程独立为一个进程组
如果进程中只是组长进程结束,当前进程组不会解散,只有进程组的所有进程离开(终止或转移),该进程组才会解散
一个进程可以为自己或子进程设置进程组ID
注意:组长进程不能设置进程组id
如果进程ID==进程组ID==会话ID,那么该进程为会话首进程
获取所属进程组id
所属头文件
#include<unistd.h>
函数
pid_t getpgrp(void)
功能:
获取当前进程的进程组ID
参数:
无
返回值:
总是返回调用者的进程组ID
函数:
pid_t getpgid(pid_t pid);
功能:获取指定进程的进程组ID
参数:
pid:进程号,如果pid=0,那么该函数作用和getpgrp一样
返回值:
成功:进程组ID
失败:-1
设置进程组
函数:
int setpgid(pid_t pid,pid_t pgid)
功能:
改变进程默认所属的进程组,通常可以用来加入一个现有的进程组或创建一个新进程组
参数:
将参1对应的进程,加入参2对应的进程组中
返回值:
成功:0
失败:-1
会话
会话是一个或多个进程组的集合
一个会话可以有一个控制终端,这通常是终端设备或伪终端设备,建立与控制终端连接的会话首进程被称为控制进程
一个会话中的几个进程组可以一个前台进程组以及一个或多个后台进程组
如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组
如果终端接口检测到断开连接,则将挂断信号发送至控制进程(会话首进程)
函数getsid
作用:获取会话id
所需头文件
#include<unistd.h>
函数:
pid_t getsid(pid_t pid);
参数:
pid: 进程号,pid为0表示查看当前进程 session ID(会话id)
返回值:
成功:返回调用进程的会话ID
失败:-1
组长进程不能成为新会话的首进程,新会话首进程必定会成为组长进程
函数setsid
作用:创建会话
所需头文件:
#include <unistd.h>
函数:
pid_t setsid(void);
功能:
创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID,调用了setsid函数的进程,既是新的会长,也是新的组长
参数:
无
返回值:
成功:返回调用进程的会话ID
失败:-1
注意:
1,组长进程不能设置为会话
2,需要root权限(ubuntu不需要)
3,新会话丢弃原有的控制终端,该会话没有控制设备
相关文章:

linux高级系统编程之进程
进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…...
nextjs+nestjs+prisma写todolist全栈项目
技术栈 nextjsnestjsprisma所学知识 Nextjs组件渲染,状态,路由docker启动Mysql容器prisma操作Mysql(CRUD)允许跨域请求APITanStack Query异步状态管理fetch api服务器组件预请求数据nestjs 管道和异常处理检测id是否正整数Docker启动Mysql容器 compose.yml name: todoLis…...

基于Matlab的图像去噪算法仿真
中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪,并用Matlab软件仿真。 (1)给图像加入均值为0,方差为0.02的高斯噪声,分别选择33模板、55模板和77模板进行去噪 Matlab部分代码࿱…...

Docker pull镜像拉取失败
因为一些原因,很多镜像仓库拉取镜像失败,所以需要更换不同的镜像,这是2024/11/25测试可用的仓库。 标题1、 更换镜像仓库的地址,编辑daemon.json文件 vi /etc/docker/daemon.json标题2、然后将下面的镜像源放进去或替换掉都可以…...

fastjson不出网打法—BCEL链
前言 众所周知fastjson公开的就三条链,一个是TemplatesImpl链,但是要求太苛刻了,JNDI的话需要服务器出网才行,BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…...

vue2 中使用 Ag-grid-enterprise 企业版
文章目录 问题Vue2 引入企业版不生效npm run dev 时卡住了94% after seal 卡在这里了测试打包源 git 解决方案记录 问题 我想用企业版的树状表格 Vue2 引入企业版不生效 编译引入 // vue.config.js module.exports {transpileDependencies: ["ag-grid-enterprise"…...

Redis开发03:常见的Redis命令
1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…...
研0找实习【学nlp】14--BERT理解
以后做项目,一定要多调查,选用不同组合关键词多搜索! BERT论文解读及情感分类实战_bert模型在imdb分类上的准确率已经到达了多少的水平-CSDN博客 【深度学习】-Imdb数据集情感分析之模型对比(4)- CNN-LSTM…...

mysql之基本常用的语法
mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法:insert into table_name(列名1,列名2,....,列名n) values (值1,值…...

基于Linux的patroni搭建标准
作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…...

2024年第十三届”认证杯“数学中国数学建模国际赛(小美赛)
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓...

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…...

(四)3D视觉机器人的手眼标定(眼在手外)
内容 1.背景介绍1.1 思路T_target_to_cam求解公式求解 2.操作流程 1.背景介绍 3D视觉机器人指的是机器人通过3D相机提供的3D点云视觉信息,完成某些实际的功能。 目标是将场景信息从相机坐标系变换至机械臂坐标系中,最终是获得相机到机械臂基座的空间…...

安达发|制造业APS智能优化排产软件的四类制造模型解决方案
在制造业中,APS(高级计划和排程系统)智能优化排产软件的应用越来越广泛。它通过集成先进的算法和模型,帮助企业提高生产效率、降低成本并提升客户满意度。针对不同类型的生产需求,APS软件提供了四类制造模型解决方案&a…...

命令行使用ssh隧道连接远程mysql
本地电脑A 跳板机B 主机2.2.2.2 用户名 B ssh端口号22 登录密码bbb 远程mysql C 地址 3.3.3.3 端口号3306 用户名C 密码ccc A需要通过跳板机B才能访问C; navicat中配置ssh可以实现在A电脑上访问C 如何实现本地代码中访问C呢? # 假设本地使…...
力扣第 71 题 简化路径
一、题目描述 给定一个字符串 path,表示一个由目录名和斜杠 "/" 组成的绝对路径,请简化该路径,使其变为规范路径。 在 Unix 风格的文件系统中: 一个点 "." 表示当前目录本身;两个点 "..&q…...

使用ENSP实现OSPF
一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为2…...
分布式下怎么优化处理数据,怎么代替Join
分布式下怎么优化处理数据,怎么代替Join 简单来说, 可以采用 数据冗余,有意地存储一些重复的数据,以此减少关联查询的需求 数据拆分与多次查询,将一次获取的多表数据,拆分多个单独的查询 使用数据仓库…...

51单片机快速入门之中断的应用 2024/11/23 串口中断
51单片机快速入门之中断的应用 基本函数: void T0(void) interrupt 1 using 1 { 这里放入中断后需要做的操作 } void T0(void): 这是一个函数声明,表明函数 T0 不接受任何参数,并且不返回任何值。 interrupt 1: 这是关键字和参…...

[Java]微服务配置管理
介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...