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就可以实现配置管理服务 配置共享 我们可以把微服务共…...
c/c++ 用easyx图形库写一个射击游戏
#include <graphics.h> #include <conio.h> #include <stdlib.h> #include <time.h>// 定义游戏窗口的大小 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600// 定义玩家和目标的尺寸 #define PLAYER_SIZE 50 #define TARGET_SIZE 20// 玩家的结构…...
Rust eyre 错误处理实战教程
在《Rust 错误处理库: thiserror 和 anyhow》中我们介绍了Rust简化处理错误策略,本文解释eyre错误处理库,并通过多个实际示例进行说明,最后于anyhow库进行对比,让你更好理解其应用场景。 eyre是一个用于 Rust 的错误处理库&#x…...
面试小札:JVM虚拟机
1. 定义与基本概念 - JVM(Java Virtual Machine)即Java虚拟机,是Java程序的运行核心。它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来运行Java字节码。字节码是一种中间格式,它使得Java程序能…...
Docker扩容操作(docker总是空间不足)
Docker扩容操作(docker总是空间不足) 1、df二连,一共也就70g,总是占满93%以上。所以需要移动到其他目录上 查看docker镜像和容器存储目录的空间大小 du -sh /var/lib/docker/2、停止docker服务 systemctl stop docker3、首先创建目录并迁移 # 首先创…...
数字图像处理(4):FPGA中的定点数、浮点数
(1)定点数:小数点固定在数据的某一位置的数,可以分为定点整数和定点小数和普通定点数。定点数广泛应用于数字图像处理(图像滤波、图像缩放)和数字信号处理(如FFT、定点卷积)中。 定…...
毕昇入门学习
schemas.py 概述 这段代码主要定义了一系列基于 Pydantic 的数据模型(BaseModel),用于数据验证和序列化,通常用于构建 API(如使用 FastAPI)。这些模型涵盖了用户认证、聊天消息、知识库管理、模型配置等多…...
2411C++,学习C++提示4
结构绑定 auto [first, ...ts] std::tuple{1, 2 ,3};assert(1 first);浮点作为非类型模板参数 template<double Value> constexpr auto value Value;int main() {std::cout << value<4.2>; // prints 4.2 }template<double... Vl1s, double... Vl2s&g…...
STM32-- 看门狗--介绍、使用场景、失效场景
STM32 中的看门狗(Watchdog Timer,简称 WDG)有两种主要类型:独立看门狗(IWDG) 和 窗口看门狗(WWDG)。它们的喂狗机制各有特点,主要区别如下: 1. 独立看门狗&a…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
linux安全管理-会话安全
文章目录 1 设置命令行界面超时退出2 配置终端登录失败策略3 配置 SSH 登录失败策略 1 设置命令行界面超时退出 1、检查内容 检查操作系统是否设置命令行界面超时退出。 2、配置要求 操作系统设置命令行界面超时退出。 3、配置方法 配置命令行界面超时时间,编辑/et…...
哪些网站可以做行程/班级优化大师官网下载
一、检查Python环境python -V二、通过pip安装jupyterpip install jupyter三、生成jupyter配置文件#root客户:jupyter notebook --generate-config --allow-root#非root客户jupyter notebook --generate-config四、打开ipython,生成密码[rootxxj]# ipytho…...
顺企网宁波网站建设/关键字排名优化工具
一、文章简介 本文将从二叉搜索树的定义和性质入手,带领大家实现一个二分搜索树,通过代码实现让大家深度认识二分搜索树。 后面会持续更新数据结构相关的博文。 数据结构专栏:https://www.cnblogs.com/hello-shf/category/1519192.html git传…...
免费网站怎么做排名/营销型网站建设要点
今天介绍的算法题是LeetCode 15题,3 Sum,也成三数求和问题。链接https://leetcode.com/problems/3sum/难度Medium描述给定一个整数的数组,要求寻找当中所有的a,b,c三个数的组合,使得三个数的和为0.注意&…...
塑胶原料 东莞网站建设/长春网站推广排名
lua 文件操作 文件操作 相关函数:相比于io操作,file可同时操作多个文件 file:close ():关闭文件 file:flush ():刷新文件,将写入内容刷新到文件中 file:write ():向文件中写入内容 file.read(format)&…...
网站制作知识/seo最新优化技术
下载mysql的zip包地址:http://cdn.mysql.com/Downloads/MySQLInstaller/mysql-installer-community-5.6.15.0.msi复制文件和设置环境变量具体参照: http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html设置root用户的密码mysql> use mys…...
成都疫情最新消息发布/seo公司网站
如何使用BAT脚本调用Python 在今天的数字化时代,很多任务都可以通过编程自动化完成。Python作为一门非常流行的编程语言,被广泛应用于各种领域,可以帮助我们高效地完成许多任务。在Windows系统中,使用BAT脚本调用Python是一种常见…...