Linux -- exec 进程替换

exec 进程替换

核心概念:exec 进程替换

  1. 本质 :用新程序 把当前进程的代码段、数据段、堆栈完全替换掉,执行新逻辑。

  2. 关键特性

    • 进程号 PID 不变

    • 父子关系不变

    • 替换后原进程代码不再执行(exec 之后的代码不会运行)

  3. 作用 :让子进程执行完全不同的程序,是实现 shell 命令执行 的底层机制。

exec 函数族(6 个)

统一头文件:#include <unistd.h>

函数名 特点 说明
execl 路径 + 列表 需写完整路径,参数列表结尾必须 (char*)NULL
execlp 文件名 + 列表 自动搜索 PATH,最常用
execle 路径 + 列表 + 环境变量 自定义环境变量
execv 路径 + 数组 参数用数组传递
execvp 文件名 + 数组 自动搜 PATH,参数用数组
execvpe 文件名 + 数组 + 环境变量 带自定义环境变量

记忆规则:

  • l:list 参数以列表形式给出

  • v:vector 参数以数组形式给出

  • p:path 自动按系统 PATH 查找程序

  • e:env 自定义环境变量

典型示例

  1. execlp(最常用)
复制代码
// 执行 ps -f -e
printf("pid=%d\n", getpid());
execlp("ps", "ps", "-f", "-e", (char*)NULL);
// 下面这行永远不会执行
printf("aaa\n");
  1. execv(数组传参)
复制代码
char *arg[] = {"ps", "-f", "-e", NULL};
execv("/usr/bin/ps", arg);

经典用法:fork + exec + wait

  1. 父进程(模拟 bash)循环等待输入

  2. 输入命令后 fork 创建子进程

  3. 子进程用 exec 替换 执行命令

  4. 父进程 wait 等待子进程结束,再继续循环

流程:

复制代码
父进程循环 → 输入命令 → fork → 子进程exec → 父进程wait → 回到循环

配套常用函数

  1. fflush(stdout)

    立即刷新输出缓冲区,确保内容先打印到屏幕。

  2. strtok

    字符串分割,用于拆分命令与参数。

  3. wait(NULL)

    父进程阻塞,等待子进程退出,避免僵尸进程。

核心要点

  1. exec 只替换进程内容,不创建新进程。

  2. exec 成功后,原进程代码不再执行。

  3. 命令行终端的所有命令,底层都是 fork + exec + wait。

Mybash 实现(exec 综合应用)

核心思路

父进程不退出,循环接收命令 → fork() 创建子进程 → 子进程 exec 替换执行命令 → 父进程 wait() 等待子进程退出。

常用系统函数

  • getpwuid():通过 UID 获取用户信息结构体

    • pw_name:用户名

    • pw_uid:用户 ID

    • pw_dir:家目录

  • getcwd(buf, size):获取当前工作目录

  • gethostname(name, size):获取主机名

  • chdir(路径):切换目录

  • fflush(stdout):强制刷新输出缓冲区

  • strtok():字符串分割(拆分命令与参数)

相关推荐
YoungStudyAI6 分钟前
QA的下一个自动化阶段,可能不是再写更多脚本,而是设计测试Agent
运维·自动化
分布式存储与RustFS1 小时前
纠删码到底吃掉了多少容量:EC:4、EC:8 的利用率与容错怎么算
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
遇见小修修1 小时前
3步解决打印机0x00000709报错 ,广州深圳程序员可自行排查
运维·打印机·维修·打印机报错·打印机运维·打印机故障自查
顺顺 尼1 小时前
linux 进程信号(上)
linux·c++·算法
niuTaylor2 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
傲世仙尊3 小时前
信号量环形队列与线程池起步-把临界资源拆成很多份
linux
Huangjin007_3 小时前
【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
linux·运维·服务器
微小冷4 小时前
Mermaid画甘特图
运维·markdown·甘特图·mermaid·时间图
ShineWinsu4 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
FlightYe4 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac