当前位置: 首页 > news >正文

4.【Linux】进程控制(进程终止||进程等待||程序替换)

一.进程创建fork

见上篇文章

二.进程的终止

1.进程退出场景

1.代码运行完毕,结果正确,通过main函数退出码返回一般为0。
2.代码运行完毕,结果不正确,通过不同的退出码标识不同的错误原因
3.代码异常终止(信号)。

strerror(错误码),将退出码转化为错误原因的字符

2.如何终止一个进程

exit()函数(c语言提供的)

void exit(int status)
在任何地方调用都表示直接终止进程

_exit()函数(系统调用接口)

相较于exit()不会执行用户定义的清理函数,不会冲刷缓冲区,直接退出

main()函数中的 return语句

return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。

三.进程等待

wait()

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);

返回值:成功返回被等待进程pid,失败返回-1。
参数:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

waitpid()

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

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

参数Pid=-1,等待任一个子进程,与wait等效。 Pid>0.等待其进程ID与pid相等的子进程。 status: WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出) WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码) options: WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

输出型参数status

按照比特为的方式划分,有32位,我们只学习16位。
次低8位:子进程的退出码

(status>>8)&0xFF 

低7位:子进程收到的信号编号

status&0x7F

本质是父进程调用系统接口去拿子进程task_struct中的退出码和退出信号,由于进程具有独立性,定义全局变量无法获取。因为全局变量属于父进程,子进程想写入会发生写时拷贝

第8位:coredump标志位

进行位运算过于复杂,操作系统为我们提供了两个宏

if(WIFEXITED(status))printf("%d",WEXITSTATUS(status));

非阻塞等待

waitpid()第三个options参数如果为0,则默认为阻塞等待,若设置为宏定义WNOHANG,则为非阻塞等待。
什么是非阻塞等待?
父进程通过操作系统检测子进程状态,如果退出了就接收到子进程的退出信息。如果检测到没退出,且options等于0就挂起父进程,在等待队列中阻塞等待子进程退出(在内核中阻塞被唤醒),这是阻塞等待。相反,如果options等于WNOHANG,发现没有子进程退出,那么直接返回0不会阻塞等待子进程退出,而是采用非阻塞的轮询检测的方式

四.进程的程序替换

通过特定接口,加载磁盘上的一个全新的程序(代码和数据),加载到调用进程的地址空间中,修改页表和物理地址的映射关系,以达到让子进程执行一个全新程序的目的。

原理

exec函数替换程序后进程的pid没有改变,只是将磁盘数据加载到物理内存后,重新建立页表和物理内存的映射关系,替换成功后原程序后续代码都不执行了(替换失败后续代码仍执行)。
在这里插入图片描述
注意arg都要以null结尾,exec功能其实就是加载器的底层接口。
在这里插入图片描述

举例

int main()
{
char *const argv[] = {"ps", "-ef", NULL};
char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
execl("/bin/ps", "ps", "-ef", NULL);
// 带p的,可以使用环境变量PATH,无需写全路径
execlp("ps", "ps", "-ef", NULL);
// 带e的,需要自己组装环境变量
execle("ps", "ps", "-ef", NULL, envp);
execv("/bin/ps", argv);
// 带p的,可以使用环境变量PATH,无需写全路径
execvp("ps", argv);
// 带e的,需要自己组装环境变量
execve("/bin/ps", argv, envp);

上述接口都是系统提供的封装,实际系统调用的是execve
在这里插入图片描述

相关文章:

4.【Linux】进程控制(进程终止||进程等待||程序替换)

一.进程创建fork 见上篇文章 二.进程的终止 1.进程退出场景 1.代码运行完毕&#xff0c;结果正确&#xff0c;通过main函数退出码返回一般为0。 2.代码运行完毕&#xff0c;结果不正确&#xff0c;通过不同的退出码标识不同的错误原因。 3.代码异常终止&#xff08;信号&am…...

微服务设计:Spring Cloud 链路追踪概述

Spring Cloud 链路追踪是指在分布式系统中追踪请求路径的技术。它可以帮助开发者了解请求在各个微服务之间是如何流转的&#xff0c;以及每个微服务处理请求所花费的时间。链路追踪可以用于解决以下问题&#xff1a; 性能分析: 识别性能瓶颈&#xff0c;优化微服务性能。故障排…...

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…...

Socket.D 开源输传协议 v2.4.0 发布

Socket.D 协议 是基于"事件"和"语义消息""流"的网络应用层传输协议。有用户说&#xff0c;“Socket.D 之于 Socket&#xff0c;尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。协议特点可参考《官网介绍》。 pyton 已开发完…...

单片机学习笔记---AT24C02数据存储

目录 AT24C02数据存储 准备工作 代码讲解 I2C.c 模拟起始位置的时序 模拟发送一个字节的时序 模拟接收应答的时序 模拟接收一个字节的时序 模拟发送应答的时序 模拟结束位置的时序 I2C.h AT24C02.c 字节写&#xff1a;在WORD ADDRESS&#xff08;字地址&#xff…...

首次安装Mysql数据库

1、在mysql官网下载自己需要的版本 2、选择安装类型 3、 检查一下需求版本 4、 这里可能会弹出如下信息,先不用管这一步,点击Yes继续即可 5、 安装需要的环境,点击执行就可以,此过程会比较慢 如下就是全面安装完成了,点击next即可...

2024 前端面试题(GPT回答 + 示例代码 + 解释)No.1 - No.20

本文题目来源于全网收集&#xff0c;答案来源于 ChatGPT 和 博主&#xff08;的小部分……&#xff09; 格式&#xff1a;题目 h3 回答 text 参考大佬博客补充 text 示例代码 code 解释 quote 补充 quote 目录 No.1 - No.20 本文题目来源于全网收集&#xff0c;答案来源于…...

通过`ssh`同步`tmux`剪贴板内容

通过ssh同步tmux剪贴板内容 通过ssh连接远程服务器时&#xff0c;可以通过xclip同步tmux剪贴板内容。这需要在服务器上安装xclip&#xff0c;且需要在ssh远程连接时开启X11。 此处附tmux剪贴板调用xclip的配置&#xff1a; # Copy the current buffer to the system clipboa…...

HTTP 响应状态代码

HTTP 响应状态代码 HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。 响应分为五类&#xff1a; 信息性回复 &#xff08; 100 – 199​)成功响应 &#xff08; 200 – 299​)重定向消息 &#xff08; 300 – 399​)客户端错误响应 &#xff08; 400 – 499​)服务器错误…...

[OPEN SQL] 新增数据

INSERT语句用于数据的新增操作 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 该数据库表中的部分值如下所示 1.插入单条数据 语法格式 INSERT <dbtab> FROM <wa>. INSERT INTO <dbtab> VALUES <wa>. INSERT &…...

OpenHarmony—UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…...

Mybatis的使用

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了 SQL 映射和对象关系映射的功能&#xff0c;让开发者能够更加便捷地操作数据库。MyBatis 通过 XML 或注解的方式配置 SQL 语句&#xff0c;并将 Java 对象与数据库表进行映射&#xff0c;以简化 JDBC 的复杂操作。以下…...

Python 播放音乐

本篇是使用Python pygame库来实现操作音乐。 安装pygame 播放音乐需要pygame库&#xff0c;如果没有可以进行安装。 命令如下&#xff1a; pip install pygame 引入类库 需要引入两个类库&#xff0c;即time和pygame。 示例如下&#xff1a; import time import pygame 播…...

[嵌入式系统-21]:RT-Thread -7- 内核组件编程接口 - 定时器

目录 一、RT-Thread定时器 1.1 概述 1.2 定时器的种类 1.2.1 周期性 1.2.2 实时性 1.2.3 功能 二、 RT-Thread 定时器的一般步骤 2.1 步骤 2.2 Flag 2.3 示例 一、RT-Thread定时器 1.1 概述 在 RT-Thread 中&#xff0c;定时器是一种常用的机制&#xff0c;用于在指…...

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib&#xff1f;2. Matplotlib 基础类详解2-1. Line&#xff08;线&#xff09;2-2. Marker&#xff08;标记&#xff09;2-3. Text&#xff08;文本&#xff09;2-4. Legend&#xff08;图例&…...

SQL语言1

创建数据库 CREATE DATABASE 展示数据库 SHOW DATABASE 整数 INT 有小数点的数 DECIMA(m, n) #m是有几位数&#xff0c;n是有几位小数 字符串 VARCHAR(n) &#xff08;Binary Large Object&#xff09;图片 影片 BLOB ‘YYYY-MM-DD’日期 DATA YYYY-MM-DD HH:MM:SS 记…...

PowerShell搭建vue起始项目

Windows PowerShell搭建vue起始项目 搜索PowerShell,以管理员身份运行。 复制文件夹路径 cd 到这个文件夹位置 命令行创建项目&#xff1a;vue create 项目名 这里写自己的项目名就行&#xff0c;我写的yeb vue create yeb 创建成功后是这样的 有颜色的就是选中的&#xff…...

jmeter遇到连接数据库的问题

jmeter连接mysql或者oracle简单&#xff0c;但是连接过inceptor吗&#xff1f; 上货 1、下载驱动inceptor 5.1.2.jar包 2、在添加驱动那里导入 3、在JBC request中的写法 PS:没什么可说的...

应急响应实战笔记02日志分析篇(3)

第3篇:Web日志分析 ox01 Web日志 Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行的安全分析&#xff0c;不仅可以帮助我们定位攻击者&#xff0c;还可以帮助我们还原攻击路径&#xff0c;找到网站存在的安全漏洞并进行修复。 我们来…...

常见性能优化策略

对于经常接触高并发服务的同学来学&#xff0c;会经常涉及到性能优化&#xff0c;但是由于平时很少总结&#xff0c;内容会比较分散&#xff0c;这里简单做一些总结 1&#xff1a;空间换时间 比如一些数据的访问需要很快返回结果&#xff0c;原本在磁盘上的数据&#xff0c;需…...

DDS信号发生器设计避坑指南:基于FPGA的AD9767驱动常见问题与优化技巧

FPGA驱动AD9767实战避坑手册&#xff1a;从时序优化到DDS精度提升的进阶技巧 当你在深夜调试FPGA与AD9767的接口时&#xff0c;示波器上那些不规则的毛刺和频率偏差是否曾让你抓狂&#xff1f;作为一款经典的高速14位DAC芯片&#xff0c;AD9767在信号发生、通信系统等领域应用广…...

避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了

避开生产计划大坑&#xff1a;不懂MPS和MRP的区别&#xff0c;你的SAP PP模块白学了 在制造业数字化转型的浪潮中&#xff0c;SAP PP模块作为生产计划的核心枢纽&#xff0c;常常成为企业运营的"隐形战场"。许多实施顾问和计划专员在MD41和MD02这两个相似的事务码前陷…...

WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具

WarcraftHelper&#xff1a;让魔兽争霸3重获新生的兼容性增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否曾在现代电脑上尝试重温魔兽争…...

快速上手语音情感分析:Emotion2Vec+系统参数配置与结果解读

快速上手语音情感分析&#xff1a;Emotion2Vec系统参数配置与结果解读 1. 系统概述与核心价值 Emotion2Vec Large语音情感识别系统是一款基于深度学习的语音分析工具&#xff0c;能够自动识别语音中蕴含的情感状态。该系统由科哥团队基于阿里达摩院ModelScope平台的原始模型进…...

基于卷积神经网络的忍者像素绘卷风格迁移:从原理到实战部署

基于卷积神经网络的忍者像素绘卷风格迁移&#xff1a;从原理到实战部署 1. 引言&#xff1a;当AI遇见像素艺术 想象一下&#xff0c;你手头有一张普通的照片&#xff0c;但希望它能变成复古游戏里的忍者像素风格——就像那些经典的街机游戏画面。这听起来像是需要专业美术师才…...

如何评估 SEO 优化的成本效益_SEO优化应该重点关注哪些方面

如何评估 SEO 优化的成本效益 在当今互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了提升网站流量和品牌知名度的关键手段。SEO 优化的成本效益评估并不是一件简单的事情。如何在有限的预算内实现最大的效益&#xff0c;是每一个企业和网站运营者都需…...

DASD-4B-Thinking应用场景:科研人员用Chainlit调用长链思维模型写论文推导

DASD-4B-Thinking应用场景&#xff1a;科研人员用Chainlit调用长链思维模型写论文推导 安全声明&#xff1a;本文仅讨论技术实现与应用&#xff0c;所有内容均符合技术交流规范&#xff0c;不涉及任何敏感或违规内容。 1. 科研写作的新助手&#xff1a;当AI遇到学术研究 作为一…...

Calypso vs PC-DMIS:三坐标两大软件脱机编程实战对比与选型指南

Calypso vs PC-DMIS&#xff1a;三坐标测量软件脱机编程深度对比与实战选型策略 在精密制造领域&#xff0c;三坐标测量机(CMM)的脱机编程能力直接决定了检测效率与资源利用率。作为行业两大标杆&#xff0c;蔡司Calypso与海克斯康PC-DMIS在用户界面设计、编程逻辑、仿真验证等…...

Qwen3-ASR-0.6B作品集:Qwen3-ForcedAligner-0.6B时间戳精度图谱

Qwen3-ASR-0.6B作品集&#xff1a;Qwen3-ForcedAligner-0.6B时间戳精度图谱 你有没有想过&#xff0c;一段语音里的每个字、每个词&#xff0c;甚至每个音节&#xff0c;是在哪个精确的时间点被说出来的&#xff1f;这听起来像是电影后期制作里的黑科技&#xff0c;但现在&…...

告别AI对话失忆症:深入LangChain4j的ChatMemoryProvider与InMemoryChatMemoryStore

深入LangChain4j记忆管理&#xff1a;构建高性能会话隔离系统的实践指南 在构建企业级AI对话系统时&#xff0c;会话记忆管理往往成为决定用户体验的关键因素。想象这样一个场景&#xff1a;当用户询问"我上周提到的项目进展如何&#xff1f;"时&#xff0c;系统能否…...