当前位置: 首页 > 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.lryc.cn/news/621944.html

相关文章:

  • 力扣top100(day04-06)--贪心算法
  • 自动处理考勤表——如何使用Power Query,步步为营,一点点探索自定义函数
  • 陪伴,是挫折教育最暖的底色
  • Java 中使用阿里云日志服务(SLS)完整指南
  • Hologres实战:路径分析函数
  • 【开发语言】Groovy语言:Java生态中的动态力量
  • 1.2. qemu命令起虚拟机增加网络配置
  • [git] 当GitHub宕机时,我们如何协作?| github同步gitee的部署方法
  • uniApp App 端日志本地存储方案:实现可靠的日志记录功能
  • Flutter 自定义组件开发指南
  • Wi-Fi 与蜂窝网络(手机网络)的核心区别,以及 Wi-Fi 技术未来的发展方向
  • css变量的妙用(setProperty()的使用)
  • MySQL的学习笔记
  • 前端性能优化工具Performance面板实战指南
  • w484扶贫助农系统设计与实现
  • Android项目中Ktor的引入与使用实践
  • @[TOC](计算机是如何⼯作的) JavaEE==网站开发
  • 从理论到实战:KNN 算法与鸢尾花分类全解析
  • Python基础(Flask①)
  • Sklearn 机器学习 手写数字识别 使用K近邻算法做分类
  • DAY41打卡
  • IO多路复用底层原理
  • TDengine IDMP 高级功能(1. 元素模板)
  • frp踩坑 以及进阶教程
  • Floyd 判圈算法(龟兔赛跑算法)
  • Linux运维新手的修炼手扎之第29天
  • 【网络】IP总结复盘
  • Claude Opus 4.1深度解析:抢先GPT5发布,AI编程之王主动出击?
  • day31 UDP通信
  • Ansible 学习笔记:变量事实管理、任务控制与文件部署