Liunx:进程控制

进程终止

        三种场景,进程结束结果正确,进程结束不正确,异常终止。

        进程的退出码,也就是return,表征着进程运行结果是否正常,return 返回值被父进程接收。return 0表示进程运行结束并且结果正确。他是给用户的。

        而进程异常终止,这种场景是父进程需要关心的。进程运行结果是正确的,这是一个唯一确定的状态,只需要return0就可以。但是运行结果不正确有很多种情况,这就可以用return 返回非0的值来表征错误原因。

     echo  $? 指令输出最近一次的进程退出的退出码。非0的退出码对应具体的错误原因:

        该函数将退出码转换为字符串类型的错误信息。错误码对应的错误信息当然也可以自己定义。C语言中errno中保存最近一次使用的错误码。

        当程序因为异常而退出,此时的退出码没有意义。即先判断进程是否异常退出,再关心返回结果。

        进程异常退出本质上是接收到了信号:

        exit()与_exit():

        前者是库函数,后者是系统调用。exit()在退出时会对缓冲区做刷新,_exit()直接在OS将进程退出,不对用户层的缓冲区刷新。

进程等待:

        子进程退出后需要父进程对其进行资源回收并接收退出信息。子进程执行结束向父进程发信号,父进程如果因意外终止或者其他原因未对已经终止的子进程进行资源回收,该子进程编程僵尸进程,其创建的资源如PCB等在OS中继续存在,造成资源的浪费。

        所以父进程需要通过进程等待的方式回收子进程:

       僵尸进程演示代码:

 进程等待的两个系统调用:

        pid_t wait(int *wstatus):等待一个任意的进程,等待成功返回该进程的pid,等待失败返回-1。wstatus,一个输出型参数,OS向该参数写入,用于返回进程的退出码和异常状况。

        当父进程运行带wait,子进程没有返回,父进程会阻塞等待。

pid_t waitpid(pid_t pid, int *wstatus, int options):

        suatus参数:

        被当作位图,若进程异常,低七位被OS填充相应的异常信号,第八位是Core dump标志,次八位被OS用来填充进程的退出结果。 

        即当等待进程退出后,先检查status的低七位,若为0,说明进程没有发生异常。其次再取次八位的返回结果。

        status由OS从相应进程的task_struct中获取:

非阻塞轮询:

        waitpid() 第三个参数设置为WNOHANG为非阻塞轮询。设为0为阻塞等待。

        用返回值来判断该调用的执行情况。ret<0 等待失败;ret=0子进程未就绪,继续等待;ret>0为成功等待的子进程的pid。

        

        父进程在轮询是在ret=0的代码块中做自己的任务。

        waitpid()可以保证父进程是最后退出的。

进程替换:

        3号手册程序替换的系统调用有六个,2号手册有一个,一共七个相关接口。

示例代码:

 原理:

         进程执行到execl()系统调用,将要替换的程序和数据在内存中直接覆盖原进程的代码和数据,然后在PCB中调整下相关结构,就完成一次进程替换

        多进程时,代码数据覆盖时发生写时拷贝,不影响父进程,父子进程仍保持独立性。并且替换时只修改了相应进程task_struct和mm_struct结构内的一些成员。

        execl系列函数调用失败时才会执行原程序后续代码。它不需要返回值。

        由于可执行程序ELF文件是有自己的格式的。分段:

        程序的入口就被保存在文件头中,所以,程序替换后,liunx可以定位到表头中可执行程序的入口 。

        execl():可变参数。第一个参数是要替换的程序所在位置,然后将后续参数以一个一个分割的字符串形式传递。最后一个参数为NULL。

        execlp():无需传递路径,他会在系统的环境变量路径中查找要替换的可执行程序文件。只需要传递文件名和参数。

        execv():路径加一个指针数组

        execvp():默认去系统路径寻找文件。传递指令参数 。

        execvpe():第三个参数允许传递自己的设计的环境变量。

        将文件指定为相应的解释器,如python,bash,java等解释器,然后传入相应的调用指令,就可以实现c语言调用其他语言的程序文件。execvpe()允许向调用的程序中传入环境变量,通过它就可以实现将一个程序执行后形成的环境变量导入到另一个程序。

        一个进程的地址空间中本身就有环境变量,进程替换后系统维护的task_struct中的环境变量不被替换。fork()出的子进程会继承该环境变量。

        由于在shell中执行一个程序是以shell的子进程形式执行,当向shell export 一个环境变量时,在该shell下执行的进程也能继承到该环境变量,并且也会被该子进程的子进程一路继承下去。

获取环境变量

        程序获取环境变量有三种方式:

        命令行参数,;

        声明外部变量 extern char **environ;

        getenv();接口

        向该进程的上下文中添加环境变量:putenv(); 该接口只向当前进程的上下文导入环境变量,不影响父进程,这就允许在一路下沉中的一系列子进程中,可以通过在父进程中调用putenv(),使子进程继承到该变量。

        putenv();修改后的环境变量通过char **environ获取,并可以通过它调用execle()传递给子进程。这样就可是将一些数据传递给子进程。

        如果不想传递系统的环境变量,可以自定义一些环境变量:

makefile一次编译两个文件:

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

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

相关文章

C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数

在这篇文章中&#xff0c;我们将解释什么是指数线性单元&#xff08;ELU&#xff09;&#xff0c;以及如何利用ELU激活函数。通过学习这些知识&#xff0c;你将能够使用C软件创建C应用程序。 我们需要了解哪些关于激活函数的知识&#xff1f; 激活函数&#xff08;phi()&#…

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…

豆包大模型团队开源RLHF框架,破解强化学习训练部署难题

1. 引言 1.1 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是与监督学习和无监督学习并列的一种机器学习方法&#xff0c;其用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题…

练习LabVIEW第四十三题

学习目标&#xff1a; 模拟红绿灯&#xff0c;红灯亮十秒&#xff0c;绿灯亮五秒&#xff0c;交替&#xff0c;并用波形图将波形显示 开始编写&#xff1a; 前面板 两个指示灯&#xff0c;一个红色&#xff0c;一个绿色&#xff0c;一个波形图&#xff1b; 程序框图 创建…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页&#xff0c;为什么我们还要学css&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;也叫层叠样式表&#xff0c;是负责美化的&#xff0c;我们之前说html就是一个骨架&#xff0c;css就可以用来美化网…

解析 “Cookies Not Marked as HttpOnly” 漏洞

一、引言 在 Web 应用安全领域&#xff0c;Cookies 相关的漏洞一直是备受关注的问题。其中&#xff0c;“Cookies Not Marked as HttpOnly” 漏洞可能会对用户数据安全和网站的正常运行造成潜在威胁。本文将详细介绍这个漏洞&#xff0c;包括其原理、影响、检测方法以及修复措…

基于MATLAB DCT域图像水印技术

1数字水印技术的概念和特点 数字水印&#xff08;Digital Watermark&#xff09;技术是将与多媒体内容相关或不相关的一些标示信息直接嵌入多媒体内容当中&#xff0c;但不影响原内容的使用价值&#xff0c;并不容易被人的知觉系统觉察或注意到。通过这些隐藏在多媒体内容中的…

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 文章目录 【语义分割|代码解析】CMTFNet-2: …

在暗处执着生长,终有一日馥郁传香

总有人说很孤独&#xff0c;一个人吃饭&#xff0c;一个人上班&#xff0c;一个人逛街&#xff1b; 总有人又说享受孤独&#xff0c;面对时间&#xff0c;迎接苦难&#xff0c;战胜痛苦&#xff1b; 可没人说这些的大前提是你要有信念支撑啊&#xff0c;如果干完了上面的所有&a…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像&#xff0c;并通过深度学习的OCR&#xff08;光学字符识别&#xff09;识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别&#xff0c;需要以下几个基本步骤&…

JavaScript 网页设计详解教程

JavaScript 网页设计详解教程 引言 JavaScript 是一种广泛使用的编程语言&#xff0c;主要用于网页开发。它使得网页具有动态交互性&#xff0c;能够响应用户的操作。随着前端开发的不断发展&#xff0c;JavaScript 已成为现代网页设计中不可或缺的一部分。本文将详细介绍 Ja…

高新技术企业知识库搭建:在创新创业中的支撑作用

在快速迭代的科技时代&#xff0c;高新技术企业&#xff08;以下简称“高企”&#xff09;作为推动经济社会发展的核心力量&#xff0c;正面临着前所未有的创新挑战与机遇。知识库&#xff0c;作为信息时代的智慧宝库&#xff0c;不仅承载着企业内部的宝贵知识与经验&#xff0…

ReposVul: A Repository-Level High-Quality Vulnerability Dataset 论文阅读

本文发表于 ICSE2024 会议中。 引入 在过去的漏洞数据库中&#xff0c;主要存在以下几种问题&#xff1a; 无效补丁&#xff08;Tangled Patches&#xff09;&#xff1a;针对某个漏洞的补丁无法正确修复该漏洞缺乏跨函数漏洞&#xff08;Inter-procedural Vulnerabilities&…

【图解版】力扣第70题:爬楼梯

推理出状态表达式 f(5)表示到达第5层&#xff0c;所有可能的方法数。 到达第5层&#xff0c;有可能是从第4层走一步上来&#xff0c;也有可能是从第3层走两步上来。所以我们可以慢慢延伸&#xff0c;画出上面&#x1f446;&#x1f3fb;的图。 从图中&#xff0c;我们可以看到…

使用Docker快速部署FastAPI Web应用

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行&#xff0c;镜像是容器的只读模板&#xff0c;容器是模板的一个实例。镜像是分层结…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

Java项目实战II基于Java+Spring Boot+MySQL的高校办公室行政事务管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在高等教育…

非计算机背景但是想从事医学AI研究,需要掌握的编程语言|个人观点·24-11-08

小罗碎碎念 目前&#xff0c;我们从事医学AI研究的&#xff0c;接触的最多的两种编程语言应该就是R和Python了。那么初学者很容易提出一个疑问&#xff0c;**我想从事医学AI相关的研究的话&#xff0c;应该学哪些编程语言呢&#xff1f;**在文章的开头&#xff0c;我可以先给出…

arkUI:Flex弹性布局的各个属性

arkUI&#xff1a;Flex弹性布局的简单使用 1 主要内容说明2 相关内容2.1 Flex弹性布局的方向2.1.1 源码1的简答说明2.1.2 源码1 &#xff08;Flex弹性布局的方向&#xff09;2.1.3 源码1运行效果2.1.3.1 当direction: FlexDirection.RowReverse2.1.3.2 当direction: FlexDirect…

高效Web测试:构建Pytest、Allure和Jenkins的自动化测试生态

Pytest介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a;简单灵活、容易上手、文档丰富&#xff1b;支持参数化&#xff0c;可以细粒度地控制被测用例&#xff1b;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来…