C语言— exec系列函数

exec系列函数

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

exec 系列函数概述

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

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

execve

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

c 复制代码
#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

c 复制代码
#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 /home
    if (execve("/bin/ls", args, env) == -1) {
        perror("execve failed");
        exit(EXIT_FAILURE);
    }

    // 这行代码不会被执行,因为 execve 成功的话不会返回
    return 0;
}

其他 exec 函数

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

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

示例:使用 execlp

c 复制代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    char *args[] = {"ls", "-l", "/home", NULL};

    // 使用 execlp 执行 ls -l /home,从 PATH 环境变量中查找 ls
    if (execlp("ls", "ls", "-l", "/home", (char *)NULL) == -1) {
        perror("execlp failed");
        exit(EXIT_FAILURE);
    }

    // 这行代码不会被执行,因为 execlp 成功的话不会返回
    return 0;
}

总结

  • execve 是最底层、最灵活的 exec 函数,允许直接指定程序路径、参数列表和环境变量。
  • 其他 exec 函数是 execve 的变种,简化了参数传递和环境变量处理。
  • exec 系列函数在成功执行后不会返回,而是用新程序替换当前进程映像。
相关推荐
计算机安禾9 小时前
【计算机网络】第10篇:距离矢量路由算法——Bellman-Ford方程与RIP协议的特性分析
计算机网络·算法
m0_738120729 小时前
Webshell流量分析——常见扫描器AWVS,goby,xray流量特征分析
服务器·前端·安全·web安全·网络安全
郝学胜-神的一滴9 小时前
Python 鸭子类型:优雅的多态哲学,让代码更自由
linux·服务器·开发语言·python·网络协议
北冥湖畔的燕雀9 小时前
POSIX信号量操作全解析
linux·运维·服务器
机器学习之心9 小时前
基于开普勒优化算法(KOA)优化CNN-BiGRU-Attention混合网络的时间序列预测模型,MATLAB代码
算法·时间序列预测模型·开普勒优化算法
草莓熊Lotso9 小时前
Python 入门必吃透:函数、列表与元组核心用法(附实战案例)
大数据·服务器·开发语言·c++·人工智能·python·qt
jimy19 小时前
记第一次运行codex
c语言·ai编程
Java成神之路-10 小时前
【LeetCode 刷题笔记】367.有效的完全平方数 | 二分查找经典刷题题解
算法·leetcode
晚风_END12 小时前
Linux|操作系统|zfs文件系统的使用详解
linux·运维·服务器·数据库·postgresql·性能优化·宽度优先
一切皆是因缘际会17 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构