进程控制的一些具体操作

news2025/7/12 11:28:28

目录

      • 进程控制
        • 进程终止
          • 进程退出的方式
        • 进程等待
          • 进程等待的方法
            • wait使用方法
            • waitpid使用方法
        • 进程程序替换
          • 替换函数
            • execl函数
            • execv函数
            • execlp函数
            • execvp函数
            • execle函数
            • execve函数---->只有这一个是系统调用,其他都是库函数
            • execvpe函数


补充几个知识:

  1. %s/被替换的文件名/替换文件名/g 就可以实现替换替换之后所有的test都被替换成了tt在这里插入图片描述在这里插入图片描述
  2. 如何在Makefile中一次形成两个可执行?在这里插入图片描述
    形成多个可执行同理,只需要把想生成的可执行跟在all后面即可

进程控制

一、fork函数初识(见之前)

  • 写实拷贝
    二、fork常规用法

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段,例如:父进程来等待客户端的请求,生成子进程来处理请求

  • 一个进程要执行不同的程序,例如:子进程从fork返回后,调用exec函数

三、fork调用失败的原因

  • 系统中有太多的进程
  • 实际用户的进程超过了限制

创建进程是需要很大成本的


进程终止

一、进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果错误
  • 代码异常终止(一般程序崩溃后退出码也就没有意义了)

为什么main总会return 0?意义在哪?

  • main函数的return值是进程的退出码
    • 查看退出码:echo $?(输出最近一次进程退出时的退出码)
    • 一般用0表示:success
    • !0:failed(错误)之所以用!0表示,是因为相比于程序错误,我们更想知道的是为什么程序会错误,所以我们可以通过结束时的退出码,来查看进程退出的原因,所以可以用具体的数字来代表一种退出原因
    • strerror() :可以查看退出码所对应的内容头文件string.h
进程退出的方式
  1. main函数return,代表进程退出,非main函数return叫做函数返回

  2. exit():进程终止,头文件stdlib,在任意地方调用都代表终止进程,参数是退出码

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    int main()
    {
        printf("hello word!");
        sleep(4);//数据被暂存到输出缓冲区中
        exit(EXIT_SUCCESS);
        //return 0;
        //都能够看到hello word被打印,说明刷新了缓冲区
        //其原因就是main return or exit 本身就会要求系统,进行缓冲区刷新!
    }
    
  3. _exit():终止进程,头文件unistd,强制终止进程,不要进行进程的后续收尾工作,比如刷新缓冲区(指的是用户级缓冲区)在这里插入图片描述在这里插入图片描述
    进程退出,OS层面做了什么?

    系统层面,少了一个进程:free PCB,free mm_struct, free页表和各种映射关系


进程等待

  • 进程为什么要等待?

    父进程fork之后,可能有这样一种情况:父进程需要子进程完成某种任务,这样父进程就需要知道子进程完成的情况,所以一般需要父进程通过wait/waitpid等待子进程退出,这种现象就叫做进程等待

  • 为什么要父进程等待?

    1. 通过获取子进程退出信息,能够得知子进程执行结果
    2. 可以保证:时序问题,子进程先退出,父进程后退出
    3. 进程退出的时候,会先进入僵尸状态,会造成内存泄露的问题,需要通过父进程wait,释放该子进程占用的资源
进程等待的方法
wait使用方法
  • 返回值: 成功返回被等待进程pid,失败返回-1。

  • 参数: 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

  • 例子:

在这里插入图片描述在这里插入图片描述在这里插入图片描述
可以观察到一开始有两个进程同时运行,之后有一个进程变成了僵尸进程,又过了一段时间这个僵尸进程也结束了,这个就可以说明首先wait是可以回收僵尸进程的,同时wait的返回值如果正常返回就是等待那个进程的pid,如果异常返回就是返回-1

waitpid使用方法

在这里插入图片描述在这里插入图片描述

  • 头文件与wait相同:pid_ t waitpid(pid_t pid, int *status, int options);

  • 返回值:

    1. 当正常返回的时候waitpid返回收集到的子进程的进程ID
    2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0
    3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在
  • 参数:

    1. pid:

      • Pid=-1,等待任一个子进程。与wait等效。
      • Pid>0.等待其进程ID与pid相等的子进程
    2. status(输出型参数):

      • WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)

      • WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

      • 例子:(一定要让父进程通过status得到进程执行的结果)在这里插入图片描述
        这里的status就不是简单的一个整型了,我们知道它有32个比特位,但是判断代码运行结果:只使用低16个比特位!高16比特位暂时不考虑(如果没有收到信号代表代码是运行完成的,没有异常终止);次低8位代表的就是进程退出的退出码,前7位就是进程的终止信号,如果程序没有异常终止那么就为0

      • status来获取进程的退出码或者退出信号

        在这里插入图片描述
        下面这个例子是程序被异常终止,也就是接受到了信号在这里插入图片描述

      • bash是命令行启动的所有进程的父进程,它一定是通过wait的方式得到子进程的退出结果,所以我们能看到echo $?能够查到子进程的退出码

      • 操作系统给我们提供了两个宏,可以就是让我们每次查看退出码的时候都进行位操作,一个是WIFEXITED如果没有收到退出信号就为真,就可以用WEXITSTATUS来获取退出码在这里插入图片描述

    3. options:

      • options的值为0:默认行为,阻塞等待;设置为WNOHANG:设置等待方式为非阻塞
      • 阻塞的本质:其实就是进程的PCB被放入了等待队列,并将进程的状态改为S状态
      • 返回的本质:进程的PCB从等待队列拿到R队列,从而被CPU调度
      • 非阻塞:调度一个接口cpu可以正常返回,cpu不断重复调度父进程就是不断重复waitpid的过程
      • WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的PID。在这里插入图片描述在这里插入图片描述

进程程序替换


进程不变,仅仅替换当前进程的代码和数据的技术叫做进程的程序替换

  • 为什么要进行程序替换?

    想让子进程执行一个全新的程序

  • 什么是程序替换?(原理?)

    用新进程的代码和数据替换掉原来的代码和数据,其他都不变。

    程序替换的本质:就是把程序的进程代码和数据加载到特定的进程上下文中(加载就需要加载器,它的底层原理可以理解成exec*程序替换函数(*可以理解成系列),进程程序替换会更改代码区的代码,这也会发生写时拷贝

  • 进程的程序替换使用----怎么办?----阶段一

    1. 现象:就是替换之后后续的代码不会执行,如果是子进程发生了程序替换,那么只会改变子程序的代码和数据不会影响父进程在这里插入图片描述
    2. exec* 如果有返回值那么就是调用失败
  • 阶段二

    各个程序替换函数的基本使用

替换函数

在这里插入图片描述

命名理解

  • l(list):表示参数采用列表形式
  • v(vector):参数用数组
  • p(path):有p自动搜索环境变量PATH
  • e(env):表示自己维护环境变量(通俗点就是可以自定义环境变量,具体使用见execve)
execl函数
int execl(count char*path,count char *arg,...);
//path 就是要执行的文件全路径一定要是路径+文件名
// ... 意思是可变参数列表,要执行的目标程序在命令行上怎么执行这里就怎么一个一个传递进去()
//必须以NULL作为传入的参数的结束

在这里插入图片描述

execv函数
int execv(const char* path,char *const argv[]);
//第一个参数还是传全路径
//第二个参数传的是一个数组,在命令行上怎么执行就将其存在数组中,然后传进去,要以NULL结尾


与execl除了传参的不同,其他没有区别

execlp函数
int execlp(const char* file,const char* arg,...);
//第一个参数是文件名,需要在环境变量当中才行,会自动去找寻地址
//后面的参数跟execl相同

execvp函数
int execvp(char* file,char *const argv[]);
//不用带路径会自动去环境变量中找,且通过数组传参

execle函数
int execle(const char* path,const char *arg,...,char *const envp[]);
execve函数---->只有这一个是系统调用,其他都是库函数
int execve(const char* path,char *const argv[],char *const envp[]);

用法同execle,唯一的区别就是它传的是数组

execvpe函数
int execvpe(const char *file, char *const argv[],char *const envp[]);

跟上面的没有什么区别就是多了个p,可以参照之前的来看

为什么会有这么多接口?

是为了满足不同的应用场景

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

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

相关文章

代码随想录——冗余连接II(并查集)

题目 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。 输入一个有向图&#xff0c;该图由一个有着 n 个节点&am…

vb.net自定义白板

希沃白板在学校里基本上是一直使用的&#xff0c;但是在非希沃电脑里面是没有启动白板的 简答介绍思路和具体的功能 1、背景颜色和画笔颜色自由切换、画笔粗细1~20可以调节。 2、画笔样式&#xff1a;虚线、点线、短线 3、基本图形&#xff1a;矩形&#xff0c;正方形&…

程序员级别分析,看看你是哪个级别

关于程序员的工资众说纷纭&#xff0c;有说开七八千的&#xff0c;也有人说每月上万的&#xff0c;但不管怎么说&#xff0c;程序员的工资是真的比一些文职、行政人员岗位挣得多&#xff0c;大家都是靠自己的能力赚钱&#xff0c;这没什么可比的&#xff0c;况且大家都是在学习…

JAVASE零基础到高级教程(1)------ 集成开发环境安装使用

一 什么是环境变量 环境变量是在操作系统中⼀个具有特定名字的对象&#xff0c;它包含了⼀个或者多个应⽤程序所将使⽤到的 信息。例如Windows和DOS操作系统中的path环境变量&#xff0c;当要求系统运⾏⼀个程序⽽没有告诉它程 序所在的完整路径时&#xff0c;系统除了在当前⽬…

前端框架 Electron 使用总结

目录 一、基础搭建 通过脚手架搭建 1、Electron官方案例搭建环境 2、查看调试 3、菜单的使用 4、图标配置 5、项目打包 web应用相信每位程序员都不陌生&#xff0c;PC端应用可能会底层开发的就不是太多了&#xff0c;下面的这套技术栈就是为前端程序员快速一键搭建windo…

Linux学习——网络编程基础及TCP服务器

目录 一、网络采用分层的思想&#xff1a; 二、各层典型的协议&#xff1a; 三、网络的封包和拆包&#xff1a; 四、网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五、TCP编程API TCP协议分成了两个不同的协议&#xff1a;可靠传输&#xff1a;用来检测网络…

读书笔记-学习GNU Emacs-3终篇

学习本书目的&#xff1a; emacs的学习一直是陆陆续续看博客和上手实践&#xff0c;这次想通过阅读"学习GNU Emacs"这本书好好系统的再复习下emacs。 yps:读技术书应该是带着一定的目的去读的&#xff0c;最简单的目的可能就是为了学好某一项技术或者复习下某一项技…

[附源码]java毕业设计社区健康服务平台管理系统lunwen

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

IDEA利用maven建立javaWeb项目(IDEA 2021.3.3)

1、在Idea中配置maven (1)、打开Idea&#xff0c;点击File&#xff0c;然后点击Settings&#xff0c;进入设置&#xff0c;或者直接按CtrlAltS进入设置 (2)、先在左上角的搜索框输入maven&#xff0c;找到maven后单击&#xff0c;然后在右边的maven home path的右边选择你的m…

置信度--学习笔记

置信区间是衡量测量精度的一个指标&#xff0c;也能显示出估算有多稳定&#xff0c;也就是说如果重复做某项实验&#xff0c;得到的结果与最初的估计有多接近。步骤&#xff1a; 确定要测试的情况&#xff1a;如“A大学男生的平均体重是80公斤”&#xff0c;则后续就是要测试在…

最新最全面的Spring详解(三)——Resources,验证、数据绑定和类型转换与Spring表达式语言(SpEL)

前言 本文为 【Spring】Resources与Spring表达式语言&#xff08;SpEL&#xff09; 等相关知识&#xff0c;下边将对Resources&#xff08;包含&#xff1a;Resource接口、内置的 Resource的实现、ResourceLoader接口、应用环境和资源路径&#xff09;&#xff0c;验证、数据绑…

浅谈化工生产制造企业软件系统的选择

现在大家都在讨论全球COVID流行和经济衰退对企业的影响&#xff0c;以及一个有作为的企业&#xff0c;在当下的环境下如何求生存和谋发展的问题。“埃森哲的一份报告发现&#xff0c;99%的首席运营官都认为&#xff0c;使用实时数据运营对于应对Covid或经济衰退威胁等至关重要。…

Java的JDBC编程

1. 数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0c;C、C、Python等数据库&#xff0c;如Oracle&#xff0c;MySQL&#xff0c;SQL Server等数据库驱动包&#xff1a;不同的数据库&#xff0c;对应不同的编程语言提供了不同的数据库驱动包&#xff0c;如&#xf…

Telnet SMTP协议关于“535 Error: authentication failed“解决思路

计算机网络中应用层的SMTP(Simple Mail Transfer Protocol)协议可用来发送邮件&#xff0c;在Telnet使用SMTP登陆账号密码时出现“535 Error: authentication failed”问题。现记录解决步骤。 1. 确认在邮箱中已开启SMTP服务。 2. 按照扫码流程&#xff0c;获得授权密码&…

第六章第二节:图的遍历(广度优先遍历和深度优先遍历)和应用(最小生成树、最短路径、有向无环图的描述表达式、拓扑排序、关键路径)

文章目录1. 图的遍历1.1 广度优先搜索&#xff08;BFS&#xff09;1.1.1 遍历序列的可变性1.1.2 复杂度的分析1.1.3 广度优先生成树1..1.4 广度优先生成森林1.2 深度优先搜索&#xff08;DFS&#xff09;1.2.1 树的深度优先遍历1.2.2 图的深度优先遍历1.2.2 复杂度的分析1.2.4 …

Servlet | 域对象、request对象其它常用的方法

目录 一&#xff1a;域对象 1、应用域对象 2、请求域对象 二&#xff1a;request对象其它常用的方法 一&#xff1a;域对象 1、应用域对象 &#xff08;1&#xff09;应用域对象是什么&#xff1f; ServletContext &#xff08;Servlet上下文对象。&#xff09; 什么情况…

NCV7705DQAR2G 汽车电机驱动器(NCV7705DQR2G)引脚配置

型号&#xff1a;NCV7705DQAR2G NCV7705DQR2G 封装&#xff1a;36-BFSOP 类型&#xff1a;电机驱动器&#xff0c;控制器 NCV7705/NCV7705(A)是一款功能强大的汽车车身控制系统驱动IC。该集成电路设计用于控制车辆前门的多个负载。单片集成电路可以控制镜面定位、加热、折叠等…

JS测试出最小支持字体,以及修复PDFJS的文本错误偏移

PDFJS的文本层有时会有一个错误的整体偏移&#xff0c;导致文本处于错误位置&#xff0c;导致用户选择错误的文本。 为什么会这样呢&#xff1f;其一&#xff0c;如果浏览器的文本缩放不是100%&#xff0c;而PDFJS没有检测这一点&#xff0c;导致文本排布发生偏移。安卓可以通…

[附源码]java毕业设计人口老龄化社区服务与管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一个Adapter+recycleview实现多种布局,区分布局中

文章目录&#x1f353;&#x1f353;简述&#x1f353;&#x1f353;效果图&#x1f353;&#x1f353;代码&#x1f96d;&#x1f96d;AllAdapter.java&#x1f96d;&#x1f96d; FuritAdapter3.java&#x1f96d;&#x1f96d;MainActivity.java(主函数)&#x1f96d;&#…