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

Linux 进程、线程与 exec/系统调用详解

1. waitwaitpid —— 子进程资源回收

1.1 wait

pid_t wait(int *wstatus);

功能:阻塞等待,回收任意子进程的资源空间。

参数

   wstatus:保存子进程退出状态的变量地址

   NULL:不保存退出状态

返回值

        成功:返回回收的子进程 PID

        失败:返回 -1

1.2 waitpid

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

功能:回收指定子进程的资源,功能比 wait 更灵活。

参数

pid

   < -1:回收指定进程组内的任意子进程例如 -100 表示等待 GID=100 的进程组

   -1:回收任意子进程(组内外)

   0:回收与当前调用者同一组的所有子进程

   > 0:回收指定 PID 的子进程

status

       保存子进程退出状态NULL:不关心退出状态

options

   0:阻塞等待WNOHANG:非阻塞等待

返回值

        成功:返回回收的子进程 PID

        失败:-1

        非阻塞模式下且没有子进程退出:返回 0

1.3 子进程资源回收策略

  1. wait 阻塞回收:父进程专门等待子进程退出

  2. waitpid 非阻塞回收:配合轮询实现

  3. 不回收:子进程一直运行

  4. 异步回收:子进程退出时通知父进程回收

2. exec 函数族 —— 在当前进程中执行其他程序

2.1 execl

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

功能:执行指定路径的可执行文件。
本质:将当前进程的代码段替换成新程序,不创建新进程。

参数

  path:可执行文件路径

  arg:传给程序的参数,第一个参数一般是程序名

  NULL:参数结束标志

返回值

        成功:无返回(被新程序替换)

        失败:-1

2.2 execlp

int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);

功能:从 PATH 环境变量指定的目录中查找可执行文件。

2.3 execle

int execle(const char *path, const char *arg, ..., (char *) NULL, char *const envp[]);

功能:指定环境变量执行新程序。

2.4 execv

int execv(const char *path, char *const argv[]);

功能:与 execl 类似,但用 数组 传递参数。

2.5 execvp

int execvp(const char *file, char *const argv[]);

功能:与 execlp 类似,但用 数组 传递参数。

2.6 execvpe

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

功能:结合 PATH 搜索 + 指定环境变量。

3. system —— fork + exec 封装

int system(const char *command);

功能:调用 fork() 创建子进程,并在子进程中执行 exec 族函数。

区别

   exec:不创建新进程,直接替换当前进程代码

   system:先 fork 再 exec,创建新的进程

4. 线程基础

4.1 线程概念

线程:轻量级进程,是 CPU 调度的最小单位

进程:操作系统资源分配的最小单位

4.2 进程 vs 线程

特性进程线程
调度单位资源分配最小单位CPU 调度最小单位
资源消耗创建需分配独立虚拟地址空间(0~4G)仅分配栈空间(默认 8M)
通信方式需 IPC 机制可直接共享全局变量
安全性高,地址空间隔离低,可能相互影响
创建速度较慢较快

4.3 线程创建

#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

4.4 常用线程函数

pthread_self();   // 获取当前线程 ID
pthread_exit();   // 线程主动退出
pthread_join();   // 回收线程资源

总结

wait / waitpid 用于子进程资源回收

exec 族函数用于执行新程序,不会创建新进程

system 封装了 fork + exec

线程是轻量级进程,开销小但安全性低

http://www.dtcms.com/a/333040.html

相关文章:

  • MySQL中的字符串函数
  • PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
  • 抗日胜利80周年 | HTML页面
  • 智和信通全栈式运维平台落地深圳某学院,赋能运维管理提质提效
  • TCP传输层协议(4)
  • 微信实名认证组件
  • 二十四、Mybatis-基础操作-删除(预编译SQL)
  • SAP ALV导出excel 报 XML 错误的 /xl/sharedStrings.xml
  • Android协程的用法大全
  • 汽车电子:现代汽车的智能核心
  • Unity_数据持久化_Json
  • 使用原生css实现word目录样式,标题后面的...动态长度并始终在标题后方(生成点线)
  • 第七十章:告别“手写循环”噩梦!Trainer结构搭建:PyTorch Lightning让你“一键炼丹”!
  • Codeforces Deque工艺
  • 用 FreeMarker 动态构造 SQL 实现数据透视分析
  • STM32学习笔记12-串口数据包收发FlyMcuST-LINK Utility
  • Shortest Routes II(Floyd最短路)
  • 管家婆辉煌系列试用版/期限说明
  • Shader开发(十三)理解片元插值
  • 淘米自动签到脚本
  • 大气负氧离子自动监测站:解密空气的科技密码
  • 有红帽认证证书可以0元置换华为openEuler-HCIA/HCIP认证
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|13th Aug. , 2025
  • MyBatis StatementHandler核心原理详解
  • Nginx反向代理Tomcat实战指南
  • mysql-DDLy语句案例
  • 基于asp.net#C##VUE框架的独居老人物资配送系统的设计与实现#sql server#visual studio
  • OpenZeppelin Contracts 架构分层分析
  • 基于机器学习的赌博网站识别系统设计与实现
  • 【计算机视觉与深度学习实战】02基于形态学的权重自适应图像去噪系统