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

C语言— exec系列函数

exec系列函数

在C语言编程中,exec 系列函数用于在当前进程中执行一个新程序,从而替换当前进程的映像。这些函数不会返回,除非发生错误。exec 系列函数有多个变体,其中最常用的包括 execl, execle, execlp, execv, execve, execvp 等。这里主要讨论 execexecve 两个函数。

exec 系列函数概述

exec 系列函数的行为大体相同,区别在于传递参数的方式和是否使用环境变量。以下是这些函数的一些共同点:

  1. 不返回:如果调用成功,这些函数不会返回,而是用新程序替换当前进程映像。如果失败,它们会返回 -1,并设置 errno 以指示错误类型。
  2. 参数传递:这些函数允许将参数列表传递给新程序,通常包括程序路径和命令行参数。

execve

execveexec 系列函数中最底层的一个,它提供了最大的灵活性,因为它允许直接指定程序路径、参数列表和环境变量。

#include <unistd.h>int execve(const char *pathname, char *const argv[], char *const envp[]);
  • pathname:要执行的程序文件的路径。
  • argv:传递给新程序的参数列表,其中 argv[0] 通常是程序名,argv[n] 为 NULL 表示参数列表结束。
  • envp:传递给新程序的环境变量列表,其中每个环境变量都是一个 name=value 字符串,列表以 NULL 结尾。

示例:使用 execve

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {char *args[] = {"/bin/ls", "-l", "/home", NULL};char *env[] = {NULL}; // 继承当前环境变量,也可以指定自定义环境变量// 使用 execve 执行 /bin/ls -l /homeif (execve("/bin/ls", args, env) == -1) {perror("execve failed");exit(EXIT_FAILURE);}// 这行代码不会被执行,因为 execve 成功的话不会返回return 0;
}

其他 exec 函数

其他 exec 函数是 execve 的变种,它们在参数传递和环境变量处理上有所不同:

  • execlexecv:这些函数直接接受参数列表和环境变量(或继承当前环境变量),但参数传递方式不同。
  • execlpexecvp:这些函数接受程序名而不是路径,并使用 PATH 环境变量来查找程序。
  • execle:类似于 execve,但允许指定文件描述符的关闭和重定向操作。

示例:使用 execlp

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {char *args[] = {"ls", "-l", "/home", NULL};// 使用 execlp 执行 ls -l /home,从 PATH 环境变量中查找 lsif (execlp("ls", "ls", "-l", "/home", (char *)NULL) == -1) {perror("execlp failed");exit(EXIT_FAILURE);}// 这行代码不会被执行,因为 execlp 成功的话不会返回return 0;
}

总结

  • execve 是最底层、最灵活的 exec 函数,允许直接指定程序路径、参数列表和环境变量。
  • 其他 exec 函数是 execve 的变种,简化了参数传递和环境变量处理。
  • exec 系列函数在成功执行后不会返回,而是用新程序替换当前进程映像。
http://www.lryc.cn/news/455839.html

相关文章:

  • 命名管道Linux
  • 【ios】---swift开发从入门到放弃
  • 【AUTOSAR 基础软件】PduR模块详解(通信路由)
  • [控制理论]—差分变换法与双线性变换法的基本原理和代码实现
  • 【JavaEE】——多线程常用类
  • Cilium-实战系列-(二)Cilium-Multi Networking-多网络
  • springboot自动配置
  • mock数据,不使用springboot的单元测试
  • 【pytorch】pytorch入门5:最大池化层(Pooling layers )
  • 职场上的人情世故,你知多少?这五点一定要了解
  • Python | Leetcode Python题解之第456题132模式
  • 【重学 MySQL】五十四、整型数据类型
  • 查看 Git 对象存储中的内容
  • Redis 中热 Key 的判定及其解决方案
  • elasticsearch创建索引
  • 【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验
  • 计算机网络:物理层 —— 信道复用技术
  • 期权懂|期权交易涨跌幅限制会随时调整吗?
  • 阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?
  • web:js原型污染简单解释
  • 【C++打怪之路Lv7】-- 模板初阶
  • 实战OpenCV之模板匹配
  • 【C++ 11】for 基于范围的循环
  • 创建索引时需要考虑的关键问题详解
  • 【JavaEE】【多线程】Thread类讲解
  • 硬件面试(一)
  • 9-贪心算法
  • 前端编程艺术(3)---JavaScript
  • 动态规划算法题目练习——91.解码方法
  • 每天一个数据分析题(四百九十二)- 主成分分析与因子分析