内核篇第二讲:Linux exec 函数族详解

大家好,接下来的一段时间我将开始学习野火的Linux 系统课程并将学习到的干货逐步更新到我的CSDN博客中。没时间刷课的同学可以把我的博客喂给AI 突击一下。

目录

[1、什么是 exec 函数族](#1、什么是 exec 函数族)

2、后缀含义

3、头文件

4、函数原型拆解

5、返回值

6、核心原理

快速记忆口诀

1、什么是 exec 函数族

exec 用来替换当前进程的程序,不会新建进程。调用后,当前进程的代码、数据直接被新可执行文件替换,进程 ID 不变;成功后原程序不再继续执行。

搭配:一般先用 fork() 创建子进程,再在子进程调用 exec,让子进程跑别的程序。

2、后缀含义

后缀 含义
l list,可变参数列表 传参,参数逐个写,最后以NULL结尾
v vector,字符串数组 传参,把所有参数放进char* argv[]数组
p path,自动从PATH环境变量搜索可执行文件,不用写完整路径
e environment,自定义环境变量 ,传入envp[]数组替换默认环境

组合例子:execlp = l + p;execve = v + e(execve 是 Linux 系统调用,其余都是库函数封装)

3、头文件

复制代码
#include <unistd.h>

4、函数原型拆解

  • execl:l 后缀,参数列表,必须指定可执行文件完整路径

    int execl(const char *path, const char *arg, ...);
    // 示例:execl("/bin/ls", "ls", "-l", NULL);

  • execlp:l+p,参数列表 + 自动搜 PATH,可只写文件名不用全路径

    int execlp(const char *file, const char *arg, ...);
    // 示例:execlp("ls", "ls", "-l", NULL);

  • execv:v 后缀,参数数组,指定完整路径

    int execv(const char *path, char const argv[]);
    // char
    argv[] = {"ls", "-l", NULL}; execv("/bin/ls", argv);

  • execve :v+e,参数数组 + 自定义环境变量,真正的系统调用

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

5、返回值

  • 成功:函数不返回 。exec 会直接替换当前进程的代码段、数据段,原来的程序代码直接消失,去运行新程序,后面代码不会执行。
  • 失败:返回 -1,保留原进程上下文,可以继续往下执行,一般用 perror 查看错误。

6、核心原理

exec 系列函数不会创建新进程 ! fork()创建新进程(复制一份进程),然后在子进程里调用exec,把子进程替换成目标程序。

总结:

  • l 列表,v 数组;p 找 PATH,e 换环境
  • L 后缀和 V 后缀必须两者选其一来使用
  • p 后缀和 e 后缀是可选的,可用可不用
  • 组合后缀的相关函数还有很多,可自己进一步了解
  • exce函数有可能执行失败,原因可能有以下几点:
    • 新程序的文件路径出错
    • 传参或者是自定义环境变量时,没有加NULL
    • 新程序没有执行权限
相关推荐
HideF14 小时前
Linux
linux·服务器·网络
Ruiery16 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
丰锋ff18 小时前
压缩命令笔记
linux
GeW19 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
by2099919 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
cq林志炫20 小时前
两个Linux服务器之间同步文件
linux·运维·服务器
无人生还别怕21 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
企鹅侠客1 天前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
易点云徐源1 天前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
第404号工位1 天前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构