【linuxC语言】exec函数族


前言

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


一、exec函数族

函数原型:

#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

#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

#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

#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系统的资源,编写出更加灵活、高效的程序。

相关推荐

  1. <span style='color:red;'>exec</span><span style='color:red;'>族</span>

    exec

    2024-05-02 15:32:03      18 阅读
  2. scanf、printf、string函数

    2024-05-02 15:32:03       12 阅读
  3. Qt:常见的exec()函数

    2024-05-02 15:32:03       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-02 15:32:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-02 15:32:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-02 15:32:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-02 15:32:03       20 阅读

热门阅读

  1. Docker之限制容器的资源使用

    2024-05-02 15:32:03       13 阅读
  2. 「Pudding Monsters」Solution

    2024-05-02 15:32:03       13 阅读
  3. 2024-04-29 问AI: 介绍一下 TensorFlow Hub

    2024-05-02 15:32:03       12 阅读
  4. 虚拟机软件:VMware VirtualBox Hyper-v

    2024-05-02 15:32:03       14 阅读
  5. 解决el-form中的输入框,或者下拉框无法修改赋值

    2024-05-02 15:32:03       12 阅读
  6. Python lightgbm如何使用

    2024-05-02 15:32:03       13 阅读
  7. [NSSRound#21] pwn专场

    2024-05-02 15:32:03       11 阅读
  8. XML从入门到精通

    2024-05-02 15:32:03       13 阅读
  9. 【Docker学习】docker checkpoint简单了解

    2024-05-02 15:32:03       12 阅读
  10. libass wasn‘t built with ASS_FEATURE_WRAP_UNICODE support

    2024-05-02 15:32:03       8 阅读
  11. Mybatis

    Mybatis

    2024-05-02 15:32:03      8 阅读
  12. webscoket+webrtc实现语音通话

    2024-05-02 15:32:03       13 阅读