内核篇第二讲: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
    • 新程序没有执行权限
相关推荐
爱吃香菜的初学者2 小时前
十四.Linux——消息队列
linux·运维·开发语言
Apipi*8 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP9 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC12 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding12 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK12 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil20812 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)12 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter62512 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida14 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++