1.进程回收资源空间

(1)wait函数

头文件:

       #include <sys/types.h>
#include <sys/wait.h>

函数接口:

       pid_t wait(int *wstatus);
功能:阻塞等待回收子进程的资源空间
参数:
wstatus :保存子进程消亡状态的变量地址
NULL:不保存子进程退出的状态
返回值:
成功:返回回收到的子进程的PID号
失败:-1
wait(NULL);

基本思想:

进程同步:允许父进程暂停执行,直到其子进程终止或改变状态

资源回收:确保子进程终止后其资源被正确释放(防止"僵尸进程")

状态获取:让父进程能够获取子进程的退出状态信息

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{int *p = malloc(sizeof(int));*p = 100;pid_t pid = fork();if(pid > 0){int wstatus;pid_t pidtmp = wait(NULL);printf("pidtmp = %d\n", pidtmp);/*if (WIFEXITED(wstatus)){printf("%d over normall, state : %d\n", pidtmp, WEXITSTATUS(wstatus));}else if (WIFSIGNALED(wstatus)){printf("%d ober by signal,signal num = %d\n", pidtmp, WTERMSIG(wstatus));}*/while(1){printf("ppid = %d, pid = %d, *p = %d\n",getpid(), pid, *p);sleep(1);}}else if(0 == pid){    int i = 10;while(i--){printf("pid = %d, ppid = %d, *p = %d\n", getpid(), getppid(), *p);sleep(1);}}else{perror("fork error");exit(0);}return 0;
}

(2)waitpid函数

搭配轮询回收

函数接口:

pid_t waitpid(pid_t pid, int *status, int options);
   功能:回收指定进程的资源
和wait功能相似,比wait更灵活
 参数:
pid:
<-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)
-1 回收任意子进程,组内外
0 回收和当前调用waitpid一个组的所有子进程,组内 
> 0 回收指定ID的子进程
status 子进程退出时候的状态,
如果不关注退出状态用NULL;
options 选项:
0  表示回收过程会阻塞等待
WNOHANG 表示非阻塞模式回收资源。
   返回值:

            成功 返回接收资源的子进程pid
失败  -1
设定为非阻塞且没有回收到子进程返回0 

(3)子进程资源空间回收策略

1. wait阻塞回收:一般情况下,父进程专门负责资源回收;
2. waitpid非阻塞方式回收:搭配轮询方式回收。
3. 不回收:子进程的任务需要一直执行
4. 异步回收:当子进程结束时通知父进程进行回收

2.  exec : 函数族

(1)基本概念

在一个进程里面执行另外一个文件(可执行文件):
本质:将文本去的指令代码替换成exec要执行的文件的指令。

算法思想:

不创建新进程:

与 fork() 不同,exec 不会创建新进程,只是替换当前进程的内容

参数传递多样性:

列表形式(execl, execlp, execle):以 NULL 结尾的可变参数列表

数组形式(execv, execvp, execvpe):通过字符串数组传递参数

函数关键特点
execl路径+参数列表形式,需要完整路径
execlp文件名+参数列表形式,会在 PATH 环境变量中查找可执行文件
execle路径+参数列表+自定义环境变量形式
execv路径+参数数组形式,需要完整路径
execvp文件名+参数数组形式,会在 PATH 环境变量中查找可执行文件
execvpe文件名+参数数组+自定义环境变量形式

(2)函数接口

 int execl(const char *path, const char *arg, ...   /* (char  *) NULL */);
参数:

path:要执行的可执行文件的路径和名称
arg:执行该可执行文件时需要传递的参数
NULL :参数传递结束标志
返回值:
出错:-1

 int execlp(const char *file, const char *arg, ...   /* (char  *) NULL */);
功能:
从PATH指定的系统路径下寻找该可执行文件
参数:
file:需要执行的可执行文件的名称(系统路径下已有的文件)
arg : 执行该可执行文件时需要传递的参数

       int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

l:list  列表
p:path  路径 : 系统路径
v:vector 容器
e:env  环境变量

#include <stdio.h>
#include <unistd.h>int main(int argc, char const *argv[])
{//execl("/usr/bin/pstree", "pstree", "-p", NULL);char *arg[] = {"ls", "-l", NULL};//execv("/bin/ls", arg);//execlp("ls", "ls", "-l", NULL);execvp("ls", arg);return 0;
}

3.system函数

system 通过 fork-exec 启动 shell 来执行命令(支持管道/重定向等 shell 特性),并自动处理进程等待和信号,返回命令的退出状态;而 exec 直接替换当前进程为指定程序(不启动 shell,无返回),需配合 fork 使用并手动管理子进程。

与exec函数族关键区别:

shell 处理:system 调用 /bin/sh 解析命令,exec 直接执行程序。

进程控制:system 阻塞等待命令完成,exec 替换当前进程(若成功则不返回)。

返回值:system 返回命令状态,exec 仅在失败时返回(成功则执行新程序)。

使用场景:system 适合简单命令调用,exec 适合精确控制进程替换。

用execl函数实现system函数

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{pid_t pid = fork();if(pid > 0){printf("pid = %d",getpid());}else if(0 == pid){    printf("pid = %d\n", getpid());execl("/bin/ls", "ls", "-l", NULL);}else{perror("fork error");exit(0);}pid_t pidtmp = wait(NULL);printf("pidtmp = %d\n", pidtmp);return 0;
}

4.线程的基本概念

1. 什么是线程
轻量级的进程,可实现多任务的并发。
进程是操作系统资源分配的最小单位;
线程是操作系统任务调度的最小单位。    
2. 线程的创建
线程由某个进程创建。
进程创建线程时,会为其分配独立的(8M)栈区空间;
线程和所在进程,以及进程中的其他线程,共用进程的堆区、数据区、文本区。

3. 线程的调度
宏观并行,微观串行     

4. 线程消亡
1.  线程退出
2. 回收线程资源空间

5.进程与线程的区别

进程:

           进程是操作系统资源分配的最小单位;
资源消耗:进程资源开销大,每次创建都需要有0-4G的虚拟内存空间   
效率角度:由操作系统创建,创建时耗时比线程大;跨进程调度比跨线程调度慢;
通信方面: 进程间不能直接通信,需要使用进程间通信机制(IPC机制)
安全性角度:进程安全性比线程高,各进程空间独立

     

线程:

              线程是操作系统任务调度的最小单位。
资源消耗:资源开销较小,只需要所在进程为其开辟8M的栈区空间
效率角度:由所在进程创建;跨进程调度比跨线程调度慢;
通信方面:通信简单,可以使用线程共享的区域进行通信(比如全局变量)
安全性角度:线程没有进程安全性好,一个线程异常可能影响同一进程中的所有线程

6.线程的相关编程

(1)线程的创建

头文件:

            #include <pthread.h>

函数接口:

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:创建一个新的线程
  参数:
thread : 保存线程ID的变量地址
attr:线程属性的对象地址
NULL : 按照默认属性创建
start_routine:函数的指针:指向线程启动后要执行的任务(线程任务函数)
arg:为线程任务函数传递的参数
     返回值:
成功:0
失败:非0

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void *tash(void *arg)
{printf("tid = %ld\n", pthread_self());
}int main(int argc, char const *argv[])
{pthread_t tid;int ret = pthread_create(&tid, NULL, tash, NULL);if(ret != 0){printf("pthread create error\n");return -1;}sleep(2);return 0;
}
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>typedef struct stu 
{int id;char name[32];float score;
}stu_t;void *tash(void *arg)
{stu_t *s = (stu_t *)arg;printf("id = %d, name = %s, score = %f\n", s->id, s->name, s->score);printf("tid = %ld\n ", pthread_self());
}int main(int argc, char const *argv[])
{pthread_t tid;stu_t s = {1, "laoliu", 99.9};int ret = pthread_create(&tid, NULL, tash, &s);if(ret != 0){printf("pthread create error\n");return -1;}sleep(2);return 0;
}

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

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

相关文章

java 集合 之 集合工具类Collections

前言早期开发者经常需要对集合进行各种操作比如排序、查找最大最小值等等但是当时没有统一的工具类来处理所以导致代码重复且容易出错java.util.Collections 工具类的引入为开发者提供了大量 静态方法 来操作集合它就像一个经验丰富的助手和数组工具类 Arrays 一样避免了我们重…

2025 年电赛 C 题 发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量

2025 年全国大学生电子设计竞赛 C 题 发挥部分 1&#xff1a;多正方形 / 重叠正方形高精度识别与最小边长测量 香橙派 OpenCV C 全流程解析 目录 赛题背景与需求技术难点全景图系统总体架构硬件平台与接线软件架构与线程模型算法流水线逐帧拆解 6.1 图像预处理6.2 轮廓提取与…

【自动驾驶】自动驾驶概述 ② ( 自动驾驶技术路径 | L0 ~ L5 级别自动驾驶 )

文章目录一、自动驾驶技术路径1、L0 级别 自动驾驶2、L1 级别 自动驾驶3、L2 级别 自动驾驶4、L3 级别 自动驾驶5、L4 级别 自动驾驶6、L5 级别 自动驾驶一、自动驾驶技术路径 美国汽车工程师学会 ( SAE ) 将 自动驾驶 分为 L0 ~ L5 六个级别 : 其中 L0 级别 是 完全手动 , L5…

C++少儿编程(二十二)—条件结构

1.理解条件结构小朋友们&#xff0c;今天让我们一起来探索一个神奇而有趣的知识——程序的条件结构&#xff01;首先&#xff0c;让我们来想象一个有趣的场景。比如说&#xff0c;你们正在准备去公园玩耍。在出发之前&#xff0c;你们会看看天气怎么样。如果天气晴朗&#xff0…

Ubuntu20.04下Px4使用UORB发布消息

1 .msg文件夹定义数据类型及 变量名文件位置如图&#xff0c;在PX4-Autopilot/msg文件夹下&#xff0c;笔者创建的文件名为gps_msg.msggps_msg.msg内容如下 uint64 timestamp # 时间戳 float32 latitude float32 longitude float32 altitude 同时&#xff0c;在CM…

three.js学习记录(第二节:鼠标控制相机移动)

效果展示&#xff1a; 鼠标控制一、鼠标控制 - 轨道控制器&#xff08;OrbitControls&#xff09; 1. 从nodeModules中导入OrbitControls&#xff0c;OrbitControls 是一个附加组件&#xff0c;必须显式导入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

题目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.输入The first input line has three integers n, m and q: the number of cities, roads…

分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

STM32的PWM

PWM作为硬件中几乎不可或缺的存在&#xff0c;学会 PWM&#xff0c;等于打通了 STM32 的“定时器体系”。学一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一个 I/O 就能驱动功率模块&#xff0c;非常省成本。不会 PWM&#xff…

OpenCompass傻瓜式入门教程

文章目录1 我也许不是傻瓜&#xff0c;却只想做个傻瓜2 环境要求3 安装3.1 下载源码3.2 创建虚拟环境3.3 安装4 下载数据5 查看支持的模型和数据集6 评测6.1 指定模型路径6.2 指定配置文件6.2.1 评测本地qwen2.5模型6.2.1.1 查看opencompass支持的qwen2.5模型6.2.1.2 创建配置文…

【软件测试】电商购物项目-各个测试点整理(三)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、优惠券的测试点…

流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)

> **2025年某电商大促,每秒20万订单涌入系统**——他们的风控团队仅用**47毫秒**就识别出欺诈交易。背后的秘密武器,正是融合流处理、实时分析与RAG的下一代Python ETL框架。 ### 一、范式革命:从批处理到AI增强的ETL 4.0 #### 1.1 数据处理演进史 ```mermaid graph LR …

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

​​​​​​​中国工业企业专利及引用被引用数据说明

1319 中国工业企业专利及引用被引用数据说明数据简介专利近年发文趋势及主题分布今天数据皮皮侠团队为大家分享一份2023年12月25日最新更新的中国工业企业专利及引用被引用数据&#xff0c;供大家研究使用。数据来源原始数据来源于国家统计局&#xff0c;由皮皮侠团队整理计算。…

MySQL知识点(上)

MySQL知识点 一&#xff1a;MySQL概述 MySQL是一款开源的数据库软件&#xff0c;是一种关系型数据库管理系统&#xff08;ROBMS&#xff09;&#xff0c;也叫做表数据库管理系统 如果需要快速安全地处理大量的数据&#xff0c;则必须使用数据库管理系统&#xff1b;任何基于数据…

shell脚本实现sha256sum校验并拷贝校验通过的文件

#!/bin/bash# 目标目录 TARGET_DIR"/appdata/jn1m/versions/old/bin"# 校验文件 CHECKSUM_FILE"checksum.txt"# 检查目标目录是否存在 if [ ! -d "$TARGET_DIR" ]; thenecho "错误&#xff1a;目标目录 $TARGET_DIR 不存在"exit 1 fi#…

中小型泵站物联网智能控制系统解决方案:构建无人值守的自动化泵站体系

一、系统核心架构与功能设计1.物联网感知层设备互联&#xff1a;网关对接压力传感器、超声波液位计、智能电表、振动传感器等&#xff0c;实时采集水泵运行状态&#xff08;流量、压力、温度、振动&#xff09;、液位、水质&#xff08;pH值、浊度&#xff09;、能耗等关键参数…

网络通信---Axios

1、什么是 Axios&#xff1f; Axios​ 是一个基于 ​Promise​ 的 ​HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境&#xff0c;用来发送 ​HTTP 请求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;​。 它常用于&#xff1a; 向后台 API 发送请求获取数据提交表…

Ubuntu 软件源版本不匹配导致的依赖冲突问题及解决方法

在使用 Ubuntu 系统的过程中&#xff0c;软件包管理是日常操作的重要部分。但有时我们会遇到各种依赖冲突问题&#xff0c;其中软件源与系统版本不匹配是常见且棘手的一种。本文就来详细分享一次因软件源版本不匹配引发的依赖冲突问题&#xff0c;以及具体的解决思路和流程。一…

思考:高速场景的行星轮混动效率如何理解

行星轮混动 E-CVT&#xff08;电子无级变速器&#xff09;是一种专为混合动力汽车设计的动力分配系统&#xff0c;其核心原理是通过行星齿轮组和电机的协同工作&#xff0c;实现动力分流与无级变速。 一、核心结构与组成 E-CVT的核心部件包括 行星齿轮组 和 双电机&#xff08;…