Linux复习 / 进程控制QA梳理

news/2024/5/7 14:45:35/文章来源:https://blog.csdn.net/weixin_61432764/article/details/129972567

文章目录

    • 前言
    • Q&A
      • 进程终止
        • Q:exit和_exit的区别?
        • Q:内核是如何终止进程的?
      • 进程等待
        • Q:为什么要等待子进程?
        • Q:如何等待子进程(wait/waitpid的区别)?
      • 进程替换
        • Q:为什么要进程替换?
        • Q:进程替换的原理是什么?
        • Q:如何替换进程?
      • 环境变量
        • Q:为什么执行自己的程序需要"./",而执行系统指令不需要"./"?

前言

本篇博客梳理关于Linux进程控制相关Q&A,若读者也在复习这块知识,或者正在学习这块知识,可以通过这些Q&A检测自己的知识掌握情况。此外,思维导图已经更新至我的gitee,Q&A之外的体系梳理还请移步思维导图。

Q&A


进程终止

Q:exit和_exit的区别?

A:

  • _eixt是一个系统调用函数,可以在man的2号手册中找到,而exit是一个C语言库函数,是语言级别的调用,可以在man的3号手册中找到
  • _exit只进行内核级别的清理工作:关闭文件描述符、释放内存、发送信号。而exit进行内核+语言级别的清理工作:关闭打开的流、刷新缓冲区、删除临时文件。比如
    • _exit不清理语言缓冲区,进程退出后不会将其中的内容刷新出来
    • 而exit会清理语言缓冲区,进程退出后会将其中的内容刷新出来
  • exit在底层调用了_exit,在清理完语言级别的数据后,再清理系统级别的数据

Q:内核是如何终止进程的?

A:一般情况下,内核会释放进程的数据结构和占用的内存资源。对于频繁使用的对象,内核会假释放该对象,将其放入到一个内存池中,当相同对象再次创建时,从内存池中取出一个对象并重置它的数据,给新进程使用。这有些类似STL的空间配置器。


进程等待

Q:为什么要等待子进程?

A:子进程退出,处于僵尸态,若父进程不回收子进程,过多僵尸进程占用PID资源,可能导致系统无法创建新进程。同时,父进程回收子进程也是为了获取子进程的运行情况、退出码等信息。

Q:如何等待子进程(wait/waitpid的区别)?

A:使用wait/waitpid等待子进程。两者的函数原型

pid_t wait(int* status);
pid_t waitpid(pid_t pid, int* status, int options);

关于两者的输出型参数:status
image.png

  • 0 ~ 6:若进程被信号终止,该字段表示进程的退出信号。若没有被信号终止,该字段为全0。可以使用status & 0x7F获取该字段,或者使用EIFEXITED(status)判断进程是否正常退出
  • 7 :core dump标志位,进程运行出错时的调试开关
  • 8 ~ 15:若进程正常退出,该字段表示其退出码。可以使用(status >> 8) & 0xFF或者WEXITSTATUS获取该字段

关于两函数的区别:

  • wait默认阻塞,且等待的是任意子进程
  • waitpid的参数options为0表示阻塞,为WNOHANG表示非阻塞
    • 非阻塞状态下,如果子进程没有退出,waitpid返回0。有子进程退出返回其pid
    • 且pid参数可以指定需要等待的子进程pid,pid为-1表示等待任意子进程

进程替换

Q:为什么要进程替换?

A:fork创建子进程后,父子进程数据和代码共享,此时子进程执行的代码和父进程是相似的。如果我们想让子进程执行全新的代码,完成其他的功能,就需要用到进程替换。替换后的程序可以是任何语言编写的,这也是不同语言的程序进行耦合的方式。

Q:进程替换的原理是什么?

A:fork创建子进程之后,若子进程没有进行数据修改,那么父子进程共享同样的页表,其映射的数据和代码完全一样。当进程替换发生,操作系统从磁盘加载新程序到内存中,然后修改子进程的页表与虚拟地址空间,使页表映射新程序的物理空间,不再与父进程共享同样的空间。要注意的是:进程替换没有产生新的进程,因为操作系统只是将新程序加载到内存,并没有为其创建进程控制块(task_struct)。

也可以这么理解,没有发生进程替换时,子进程的数据修改会触发数据的写时拷贝。发生进程替换时,子进程直接触发了数据和代码的写时拷贝。一般情况下,子进程的代码区数据和父进程相同,不会触发写时拷贝。而进程替换就是一个特殊情况,它会触发代码区的写时拷贝。

Q:如何替换进程?

A:关于一个程序,操作系统要执行它就要知道:1.程序所在的位置(路径),2.需要执行的程序名与执行该程序需要携带的选项。所以替换一个程序时,同样需要告知操作系统这两个信息:where + what。通常,我们使用系统调用,exec系列函数进行进程替换。

关于exec系列函数:

int execl(const char *path, const char *arg,); 
int execv(const char *path, char *const argv[]); int execlp(const char *file, const char *arg,); 
int execvp(const char *file, char *const argv[]); int execle(const char *path, const char *arg,, char * const envp[]); 
int execvpe(const char *file, char *const argv[], char *const envp[]); 

execl的函数参数:

  • path:表示程序所在的路径,最好使用绝对路径
  • arg:表示要替换的程序名称
  • …: 可变参数列表,表示执行需要需要携带的选项,以NULL结尾
    而execv使用指针数组argv[]代替arg和可变参数列表,指针数组具体使用见下图
    image.png

execlp和execvp函数涉及到PATH环境变量,使用echo $PATH可以查看PATH环境变量存储的路径,如果要替换的程序路径在这些路径下,就不需要写完整的绝对路径,只要写存在PATH路径下的文件名即可。比如

execl("/usr/bin/pwd", "pwd", NULL);
execlp("pwd", "pwd", NULL);

execle和execvep可以携带环境变量,需要传入envp[]数组,具体的使用方式和argv[]数组一样,但环境变量的设置需要满足name = value的格式,比如
image.png

直接设置环境变量会覆盖子进程从父进程继承下来的环境变量,若想在继承的环境变量上添加变量,可以使用environ指针,该指针指向一个字符串数组,比如

extern char* environ[]; // 声明环境变量
execle("/usr/bin/pwd", "pwd", NULL, environ);

此时替换的进程就会继承父进程的环境变量。


环境变量

Q:为什么执行自己的程序需要"./“,而执行系统指令不需要”./"?

A:这个问题的本质是:为什么执行自己的程序需要带上路径,而执行系统指令只需要程序名?这是因为:当shell解析指令时,将指令分成指令名和选项之后会进行判断,如果指令名没有携带路径,shell会去PATH环境变量下存储的路径中查找该程序。PATH保存了多条路径,大多都是系统指令所在的路径,若将自己程序所在的路径添加到PATH中,执行该路径下的程序也不用携带路径名。但是这样会污染PATH环境变量。设置环境变量的方法

export PATH=$PATH:要添加的路径

不同路径间用":"分割,export会覆盖原来的环境变量,$PATH的值是原来的PATH值,若不添加这条语句,原来的PATH值会被覆盖,不推荐这么做。

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

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

相关文章

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

【Linux】环境变量进程虚拟地址空间

环境变量&进程虚拟地址空间环境变量一些常见的环境变量-PATH修改环境变量进程虚拟地址空间环境变量 使用ls man pwd cd echo 这些指令时,不需要加./但是要运行我们自己的可执行程序就需要加上,本质上两个都是指令,为什么执行方法不同&am…

python学习之http客户端和服务端

Part1前言python非常简洁,非常适合写小功能以及测试接口。本文主要记录用pyhon实现一个简单的http客户端和服务端。Part2http客户端这里采用request库来实现。示例如下import requests import json url http://127.0.0.1:81/test?key1123&key2456headers {Au…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体,但程序、代码相对普通人而言,看着还是比较深奥难懂,但自从有了ChatGPT,不少对此有兴趣的外行人士,也能轻松写出代码了,比如让ChatGPT写一个贪吃蛇游戏,按它给出的…

【如何使用Arduino控制WS2812B可单独寻址的LED】

【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …

ROS实践05 订阅方实现Python

文章目录运行环境:思路:1.1 Python代码实现1)工作空间创建和编译2)功能包创建和添加依赖3)新建.py文件4)修改CMakeList5)运行节点运行环境: ubuntu20.04 noetic 宏基暗影骑士笔记本…

Java每日一练(20230409)

目录 1. 多数元素 🌟 2. 反转链表 II 🌟🌟 3. 日期之间的遍历 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 多数元素 给定一个…

使用红黑树封装map和set

目录 一、set和map的底层结构 使用模板区分map和set 使用仿函数来比较大小 二、红黑树中set和map的迭代器 end和begin迭代器 operator迭代器 operator-- 三、set与map中的迭代器和const迭代器 四、迭代器的拷贝构造 五、完整代码 set.h map.h RBTree.h 一、set和ma…

UE4 C++编写自定义动画蓝图节点

UE中自带的动画蓝图节点有限,在实现一些功能时需要通过C编写一些自定义的动画蓝图节点,本文就来讲解其基础实现,自定义节点最终效果如下: 源文件下载:https://download.csdn.net/download/grayrail/87654290 1.流程简…

linux 服务器 docker 安装 mysql 8.0.32 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/_/mysql/tags 1.版本号可不写 不写就是最新版本 最好写上 docker pull mysql:版本号2.查看镜像是否安装成功 如下图 docker images3.创建文件…

活动送票福利|Jina AI x PyCon US 2023!

作为一家总部位于德国柏林的国际化公司,Jina AI 拥有来自 10 不同国家的团队成员,在中国(北京、深圳)、美国(圣何塞)均设有办公室。全球化基因深植于 Jina AI 团队,我们也非常注重国际化社区的建…

shardingsphere-jdbc 整合 springboot

shardingsphere官网地址 https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/ 当前我们演示的是水平分表 1、基础环境配置以及依赖管理 1.1 创建数据库表结构 CREATE TABLE address_0 (id bigint(…

linux 服务器 docker 安装 jdk jre java 1.8 环境 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker jdk 镜像 https://hub.docker.com/_/java/tags 1.下载JDK镜像 注:后面如果不写版本的话 就是最新版 建议写上 docker pull java:8u111-jdk2.查看镜像是否下载成功 docker…

家装产业的数字化,正在成为越来越多人的新共识

一场数字化的浪潮,正在各行各业上演着。家装行业,亦不例外。可以说,家装产业的数字化,正在成为越来越多人的新共识。如何借助数字化的手段改造家装行业,如何乘着数字化的东风实现家装行业的全面转型升级,正…

CF区间DP作业题解

1. Recovering BST 由于互质关系不是传递的,所以尽量挂在树的最下面,刚好构成二叉树 f[i][j][0]f[i][j][0]f[i][j][0] 表示区间 [i,j][i,j][i,j] 以 iii 为根,是否可以构成一棵树。 f[i][j][1]f[i][j][1]f[i][j][1] 表示区间 [i,j][i,j][i,j…

基于非线性权重因子和纵横交叉策略的麻雀搜索算法

目录 1 主要内容 非惯性权重模型 纵横交叉策略模型 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序参考文献《基于Sobol序列和纵横交叉策略的麻雀搜索算法》对麻雀搜索算法进行改进,实现了基于纵横交叉策略和非线性权重因子的麻雀搜索算法 改进SSA算法【…

webpack配置本地TypeScript编译环境和开启本地服务

目录 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 3.安装webpack 4.配置webpack.config.js文件 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 执行npm init,文件命名为ts_demo,然后一直回车。 3.安装…

ImageIO 支持webp格式

TwelveMonkeys 提供了很多图片格式的支持,其中也包括了webp,但是其仅支持webp格式的读取,不支持webp格式的写出,这样的话如果想把图片转换成webp格式的图片就没办法实现了;下面我们使用 webp-imageio-core 对ImageIO图…

关键词采集工具可以帮助我们做那些方面的工作

针对搜索引擎的关键词采集工具可以帮助我们做那些方面的工作,至少从10个工作场景说明,并列举详细的使用场景 Msray-plus,是一款企业级综合性爬虫/采集软件。 支持亿级数据存储、导入、重复判断等。无需使用复杂的命令,提供本地W…

ROS实践01 C++ Python基本实现

文章目录运行环境:1.1 vscode 环境配置:1)ctrlshiftX 添加扩展插件:2)ctrlshiftB 配置中更换为以下代码1.2 C代码实现1)工作空间创建和编译2)功能包创建和添加依赖3)新建.cpp文件4&a…