Linux进程控制

1. 进程终止

1.1. 进程终止的本质是回收资源

1.1 释放资源
  • 内存资源
    • 释放进程的地址空间(mm_struct),包括代码段、数据段、堆、栈等,通过写时复制(CoW)共享的页会减少引用计数,若计数为 0 则释放物理内存。
    • 销毁页表、页目录等内存管理结构。
  • 文件资源
    • 关闭所有打开的文件描述符(File Descriptor),对应文件对象(struct file)的引用计数减 1,若计数为 0 则释放文件对象(关闭文件)。
    • 断开与管道、socket 等 IPC 资源的关联,清理相关内核结构。
  • 其他资源
    • 释放信号处理表、进程定时器、进程间通信(IPC)资源(如共享内存、信号量)等。
    • 从所属进程组、会话中移除,更新进程组和会话的状态。
1.2 处理进程状态
  • 进程状态从运行态 / 阻塞态等转为终止态(TASK_DEAD),不再参与调度。
  • 保存进程的退出状态(exit_status),包括终止原因(正常返回值或信号编号),供父进程查询。
1.3 处理父进程与子进程的关系
  • 通知父进程:通过信号 SIGCHLD 通知父进程 “子进程已终止”,父进程可通过 wait()waitpid() 系列函数获取子进程的退出状态。
  • 僵尸进程(Zombie Process)的产生:若父进程未及时调用 wait() 回收子进程,子进程的 PCB(进程控制块)会暂时保留(仅释放大部分资源),成为僵尸进程(状态为 Z),直到父进程回收或父进程退出。
  • 孤儿进程(Orphan Process)的处理:若父进程先于子进程终止,子进程会被init 进程(PID=1,或 systemd 等现代初始化进程)收养,init 进程会负责调用 wait() 回收孤儿进程,避免其成为僵尸进程。

1.2 进程退出的三种情况

  • 代码运行完毕,结果正确。

  • 代码运行完毕,结果不正确。

  • 代码异常终止。

1.3 进程常见退出方法

  1. main函数返回值。

  2. 调用exit函数。

  • 可以通过 echo $? 查看最近一个退出进程的退出码。

  • 退出码0代表代码运行完毕,结果正确;非0代表代码运行完毕,结果不正确。

  • 代码异常终止是通过操作系统发送信号终止的。

2. 进程等待

2.1 进程等待的必要性

  • 防止僵尸进程问题,进而造成内存泄漏

  • 方便父进程管理子进程,通过进程等待可以知道交给子进程的任务完成的怎么样。

2.2 进程等待的系统调用

2.2.1 wait

等待任意一个子进程终止。

函数原型

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

参数

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

返回值

  • 成功时:返回终止子进程的PID。

  • 失败时:返回 -1,并设置 errno。

2.2.2 waitpid
#include<sys/types.h>
#include<sys/wait.h>pid_t waitpid(pid_t pid , int *status , int options);

参数

  • pid:

    • pid > 0: 等待进程ID等于pid的特定子进程

    • pid = -1: 等待任意子进程,等同于 wait

    • pid = 0: 等待与调用进程同进程组的任意子进程。

    • pid < -1: 等于进程组ID等于pid绝对值的任意子进程。

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

  • options:

    • 默认为0,表示阻塞等待。

    • WNOHANG: 非阻塞等待(通常配合循环进行使用)

返回值

  • 成功时:返回终止子进程的PID。

  • 失败时:返回 -1,并设置 errno。

  • 如果指定了 WNOHANG 且没有子进程状态发生改变,返回0。

2.2.3 输出型参数status
  • 传递 NULL,表示不关心子进程的退出状态信息。

  • 否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。

  • status不能简单的当作整形来看待,可以当作位图来看待。

在这里插入图片描述


  • 可通过系统提供的宏解析status参数

    • WIFEXITED(status): 子进程正常终止为真。

      • 等价:(status&0x7f) == 0
    • WEXITSTATUS(status): 获取子进程的退出码。

      • 等价:(status >> 8)&0xff
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main () {pid_t id = fork();if (id == 0) {// child processint count = 5;while (count--) {printf("I am a child process , pid: %d , ppid: %d\n" , getpid() , getppid());sleep(1);}exit(100);} else if (id > 0) {// father processint status = 0;while (1) {pid_t res = waitpid(id , &status , WNOHANG);if (res > 0) {// if (WIFEXITED(status)) {    // wifexitedif ((status&0x7f) == 0) { // printf("child process exit code: %d\n" , WEXITSTATUS(status)); // wexitstatusprintf("wait success , child process exit code: %d\n" , (status >> 8)&0xff); // wexitstatus} else {printf("signal code: %d\n" , status&0x7f);}break;} else if (res == 0) {printf("sleep 1s continuous wait\n");sleep(1);} else {perror("waitpid ");exit(1);}}} else {perror("fork ");}return 0;
}

3. 进程替换

3.1 概念

程序替换是指在进程运行过程中,替换当前进程的代码和数据,使其执行另一个完全不同的程序,但进程ID(PID)保持不变

  • 被替换的部分

    • 代码段:新程序的代码指令完全替换原程序的代码指令。

    • 数据段:包括初始化的全局变量、静态变量等,被新程序的数据覆盖。

    • 堆和栈:原有堆和栈会被释放,新程序会重新初始化自己的堆和栈结构。

    • 内存映射:原进程通过mmap映射的共享库或文件会被释放,新程序会加载自己的共享库和文件映射。

3.2 替换函数

#include <unistd.h>int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);int execve(const char *path, char *const argv[], char *const envp[]);

函数后缀含义

  • l (list):参数以可变参数列表形式传递,最后一个参数必须是NULL。
  • v (vector):参数以字符串数组形式传递,数组最后一个元素必须是NULL。

  • p (path):在 PATH 环境变量指定的目录中查找可执行文件。

  • e (environment):可以传递自定义的环境变量数组。

返回值

  • exec系列函数不用返回值判断,只要返回,就是失败。
3.2.1 execl
execl("/bin/ls" , "ls" , "-l" , NULL);
3.2.2 execlp
execlp("ls" , "ls" , "-l" , NULL);
3.2.3 execle
char *env[] = { "PATH=/bin" , "USER=test" , NULL };
execle("/bin/ls", "ls", "-l", NULL, env);
3.2.4 execv
char *argv[] = {"ls" , "-l" , NULL};
execv("/bin/ls", argv);
3.2.5 execvp
char *argv[] = {"ls" , "-l" , NULL};
execvp("ls", argv);
3.2.6 execvpe
char *argv[] = {"ls", "-l", NULL};
char *env[] = { "PATH=/bin" , "USER=test" , NULL };
execvpe("ls", argv, env);

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

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

相关文章

Autoswagger:揭露隐藏 API 授权缺陷的开源工具

Autoswagger 是一款免费的开源工具&#xff0c;用于扫描 OpenAPI 文档中列出的 API&#xff0c;查找授权漏洞。 即使在拥有成熟安全团队的大型企业中&#xff0c;这类漏洞仍然很常见&#xff0c;而且尤其危险&#xff0c;因为即使技术水平不高的人也能利用它们。 Autoswagger…

Golang 语言 Channel 的使用方式

一、无缓存 channel无缓冲channel 可用于两个goroutine 之间 传递信号&#xff0c;比如以下示例&#xff1a;顺序打印1 至 100 的奇数和偶数&#xff1a;import ("fmt""time" )func main() {block : make(chan struct{})go odd(block)go even(block)time.S…

Element Plus常见基础组件(一)

基础组件 Button 按钮 一、基础用法 <el-button>默认按钮</el-button> <el-button type"primary">主要按钮</el-button>二、按钮类型 (type) 类型说明示例代码default默认按钮<el-button>默认</el-button>primary主要按钮&a…

sdxl量化加速笔记

文章目录一、量化加速sdxl模型1&#xff09;涉及模型2&#xff09;环境安装3&#xff09;转换模型safetensor to pytorch文件4&#xff09;tensorRT的环境准备&#xff08;1&#xff09;下载tensorRT 10.10&#xff08;2&#xff09;下载cuda一、量化加速sdxl模型 1&#xff0…

西门子 G120 变频器全解析:从认知到参数设置

在工业自动化领域&#xff0c;变频器作为电机驱动的核心设备&#xff0c;其稳定运行与精准控制直接影响生产效率。西门子 G120 变频器凭借可靠性能与灵活配置&#xff0c;成为众多工业场景的优选。本文将从基础认知、操作面板到参数设置&#xff0c;全方位带你掌握 G120 变频器…

【自动化运维神器Ansible】YAML支持的数据类型详解:构建高效Playbook的基石

目录 1 YAML数据类型概述 1.1 为什么数据类型很重要&#xff1f; 1.2 YAML数据类型分类 2 标量类型&#xff08;Scalars&#xff09; 2.1 字符串&#xff08;String&#xff09; 2.2 布尔值&#xff08;Boolean&#xff09; 2.3 数值&#xff08;Numbers&#xff09; 2…

基于岗位需求的康养休闲旅游服务实训室建设方案

一、康养休闲旅游服务实训室建设方案建设需求分析康养休闲旅游服务行业的快速发展对技能人才提出了精准化、场景化的能力要求&#xff0c;康养休闲旅游服务实训室建设方案需紧密对接健康咨询、接待服务、康乐服务等核心岗位群的实际需求。从岗位技能来看&#xff0c;健康咨询岗…

MES 与工业物联网(IIoT)的化学反应:为何是智能工厂的 “神经中枢”?

从“被动救火”到“主动预警”的工厂革命想象一下&#xff0c;当你正在家中熟睡时&#xff0c;智能手环突然震动&#xff0c;提醒你心率异常&#xff1b;早上出门前&#xff0c;手机 APP 告诉你爱车的某个零件即将达到磨损极限&#xff0c;建议及时更换。这些日常生活中的智能预…

工作好用小工具积累

1、内部环境太多&#xff0c;网站导航git地址&#xff1a;https://github.com/hslr-s/sun-panel/releases gitee地址&#xff1a;https://gitee.com/luofei1284999247/sun-panel

智能Agent场景实战指南 Day 26:Agent评估与性能优化

【智能Agent场景实战指南 Day 26】Agent评估与性能优化 开篇 欢迎来到"智能Agent场景实战指南"系列的第26天&#xff01;今天我们将深入探讨智能Agent的评估方法与性能优化技术。构建高效、可靠的智能Agent系统需要完善的评估体系和优化策略&#xff0c;本文将系统…

机器学习——下采样(UnderSampling),解决类别不平衡问题,案例:逻辑回归 信用卡欺诈检测

过采样&#xff1a; 机器学习——过采样&#xff08;OverSampling&#xff09;&#xff0c;解决类别不平衡问题&#xff0c;案例&#xff1a;逻辑回归 信用卡欺诈检测-CSDN博客 &#xff08;完整代码在底部&#xff09; 使用下采样解决类别不平衡问题 —— 以信用卡欺诈识别为…

Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】

Qt 槽函数被执行多次&#xff0c;并且使用Qt::UniqueConnection无效引言一、问题描述二、解决方案三、深入了解信号和槽绑定机制引言 之前刚遇到 - 信号和槽正常连接返回true&#xff0c;但发送信号后槽函数无响应问题&#xff0c;现在又遇到槽函数执行多次&#xff0c;使用Qt…

Autosar Nm-网管报文PNC停发后无法休眠问题排查

文章目录前言Autosar CanNm标准中的相关参数CanNmAllNmMessagesKeepAwakePN过滤功能CanNm_ConfirmPnAvailability问题描述问题原因排查解决方案扩展总结前言 Autosar Nm中针对于支持PN功能的收发器&#xff0c;要求PNC停发后允许进入休眠模式&#xff0c;开发过程中遇到PNC停发…

RK3568下的进程间通信:基于UDP的mash网络节点通信

基于UDP的mash网络节点通信系统实现: 最近的项目中需要实现一个功能,类似mash网络的功能,比如 类似下图中的多个节点之间,相互之间通信, 节点A自身的通信列表中,只有B和C,所以A发出的消息给B和C,依次类推,A发送的消息所有节点都能收到,同理,其他节点比如K节点发送的…

Effective C++ 条款17:以独立语句将newed对象置入智能指针

Effective C 条款17&#xff1a;以独立语句将newed对象置入智能指针核心思想&#xff1a;使用智能指针管理动态分配的对象时&#xff0c;必须确保new操作与智能指针构造在同一独立语句中完成&#xff0c;避免编译器优化顺序导致的内存泄漏。 ⚠️ 1. 跨语句初始化的危险性 资源…

Linux iptables防火墙操作

资料&#xff1a; 网络运维相关 - iptables 【Main】 https://www.zsythink.net/archives/tag/iptables/ netfilter 在 Linux 内核 TCP/IP协议栈中的位置 【框架】【Aulaxiry】 https://zhuanlan.zhihu.com/p/93630586 1 概念详解 ● 防火墙概念 ○ 主机防火墙 网络防火墙 ○…

飞书推送工具-自动化测试发送测试报告一种方式

飞书推送工具 要获取飞书开发所需的 APP_ID、APP_SECRET 以及用户的 USER_ID&#xff0c;需通过飞书开放平台和飞书客户端的相关设置操作。以下是详细步骤&#xff1a; 一、获取 APP_ID 和 APP_SECRET&#xff08;飞书应用凭证&#xff09; APP_ID 和 APP_SECRET 是飞书开放…

从零开始的云计算生活——第三十七天,跬步千里,ansible之playbook

目录 一.故事剧情 二.Playbook简介 三.Playbook核心元素(重要) 四.Playbook语法 五.Playbook的运行方式 六.Playbooks中tasks语法使用 1、file 2、lineinfile 3、replace 4、shell 5、debug 6、template/copy 7、fetch 8、unarchive 9、wait_for 10、yum 11、…

AI驱动下的数据新基建:腾讯游戏数据资产治理与湖仓架构革新

在大模型技术迅猛发展的今天&#xff0c;AI 正深度重塑数据基础设施&#xff0c;推动其向智能化快速演进。如何将 AI 深度融入数据管理&#xff0c;释放数据的潜在价值、提升运营效率&#xff0c;成为企业在构建 AI 驱动的数据资产管理体系的核心问题。在近期举办的“DataFun A…

ubuntu 系统风扇控制软件 CoolerControl

背景 A6000显卡的温度一直都是86度左右&#xff0c;GPU的风扇转速不够大。 我首先把 nvidia的驱动更新了&#xff0c;但是发现风扇依然依然保持在较低的转速。 后面无意间搜到了CoolerControl 这个linux平台的风扇控制软件。设置之后&#xff0c;增加了风扇的转速&#xff0c;…