【linuxC语言】exec函数族

文章目录


前言

在Linux环境下,C语言提供了一组强大的函数族,即exec函数族,用于执行其他程序。这些函数允许程序在运行时加载并执行不同的程序,从而实现了程序之间的无缝交互和协作。本文将介绍exec函数族的基本概念、使用方法以及示例代码,帮助读者更好地理解和利用这些函数。


一、exec函数族

函数原型:

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

int execl(const char *path, const char *arg0, ... /* (char *) NULL */);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ... /* (char *) NULL, char *const envp[] */);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ... /* (char *) NULL */);
int execvp(const char *file, char *const argv[]);

作用:

exec函数族用于在当前进程中加载并执行其他程序,替换当前进程的内存映像。它们允许程序在运行时加载不同的程序,实现程序之间的无缝交互和协作。

参数:

path:要执行的程序的路径或名称。

arg0, ...:要传递给新程序的参数列表,以及 NULL 作为结束标志。

argv[]:参数数组,包含程序名和参数,以及 NULL 作为结束标志。

envp[]:环境变量数组,每个元素是形如 "key=value" 的字符串,以及 NULL 作为结束标志。

file:要执行的程序的名称,用于在系统的 PATH 环境变量中搜索可执行文件。

返回值:

如果函数执行成功,则不返回,而是加载并执行了新的程序,因此不会有返回值。

如果函数执行失败,则返回 -1,并设置全局变量 errno 表示错误类型。

这六个函数族在功能上基本相同,但它们在接受参数和使用方式上有所不同:

execl() 和 execle():这两个函数接受可变数量的参数,用于传递给新程序的参数列表,最后一个参数必须是 NULL。execle() 还额外接受一个环境变量参数。

execv() 和 execve():这两个函数接受一个参数数组,用于传递给新程序的参数列表,数组的最后一个元素必须是 NULL。execve() 还额外接受一个环境变量参数。

execlp() 和 execvp():这两个函数与 execl() 和 execv() 类似,但它们会在系统的 PATH 环境变量中查找可执行文件。

因此,选择使用哪个函数取决于你的需求和偏好。如果你需要指定明确的文件路径,可以使用 execl()、execle()、execv() 或 execve();如果你希望在系统的 PATH 中查找可执行文件,可以使用 execlp() 或 execvp()。如果你需要传递环境变量,则需要使用带有 'e' 的函数,即 execle() 和 execve()。

二、示例代码

2.1 代码1

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

int main() {
    printf("This is the original program.\n");

    // 使用 execl() 函数加载并执行 ls 命令
    execl("/bin/ls", "ls", "-l", NULL);

    // 如果 execl() 执行成功,下面的代码将不会执行
    perror("execl"); // 输出错误信息
    return -1;
}

|

2.2 代码2

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

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 使用 execvp() 函数加载并执行 ls 命令
    execvp("ls", args);

    // 如果 execvp() 执行成功,下面的代码将不会执行
    perror("execvp"); // 输出错误信息
    return -1;
}

2.3 代码3

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

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 准备环境变量数组
    char *env[] = {"PATH=/usr/local/bin", "LANG=en_US.UTF-8", NULL};

    // 使用 execve() 函数加载并执行 ls 命令,并传递环境变量
    execve("/bin/ls", args, env);

    // 如果 execve() 执行成功,下面的代码将不会执行
    perror("execve"); // 输出错误信息
    return -1;
}

总结

通过本文的介绍,读者应该对Linux环境下的exec函数族有了基本的了解。exec函数族提供了多种方式来执行其他程序,包括根据文件路径执行、在系统PATH环境变量中搜索执行、传递参数和环境变量等。这些函数的灵活性和强大功能使得它们在编写C语言程序时非常有用。通过学习和掌握exec函数族,读者可以更好地利用Linux系统的资源,编写出更加灵活、高效的程序。

相关推荐
用户6120414922133 分钟前
C语言做的物联网设备数据采集模拟器
c语言·后端·敏捷开发
ayaya_mana7 分钟前
Linux环境下Node.js任意版本安装与pnpm、yarn包管理
linux·node.js·vim
乌龙玛奇朵51910 分钟前
Finalshell建立连接
linux
.ZGR.14 分钟前
C语言:数组的增删查改2.0
c语言·开发语言
R-G-B41 分钟前
【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
c语言·c语言文件读写·fputc·fgetc·fputs·fgets
Maple_land1 小时前
Linux进程第八讲——进程状态全景解析(二):从阻塞到消亡的完整生命周期
linux·运维·服务器·c++·centos
嵌入式分享1 小时前
嵌入式分享#41:RK3576改UART波特率【精简版】
linux·嵌入式硬件·ubuntu·嵌入式
爱吃生蚝的于勒1 小时前
【Linux】零基础学会Linux之权限
linux·运维·服务器·数据结构·git·算法·github
惜.己1 小时前
linux中jenkins正常启动外部无法访问
linux·servlet·jenkins
ajassi20001 小时前
开源 C++ QT QML 开发(十一)通讯--TCP服务器端
c++·qt·开源