一文弄懂 Linux 系统调用函数之 exec 函数族

目录

    • 简介
    • 函数原型
    • 参数说明
    • 返回值
    • 函数区别
    • 使用示例
      • [采用参数列表传递参数,以 execl 为例](#采用参数列表传递参数,以 execl 为例)
      • [采用参数数组传递参数,以 execv 为例](#采用参数数组传递参数,以 execv 为例)
      • [调用 PATH 下可执行文件,以 execlp 为例](#调用 PATH 下可执行文件,以 execlp 为例)
      • [使用新的环境变量给新进程,以 execle 为例](#使用新的环境变量给新进程,以 execle 为例)
    • 更多内容

简介

exec 函数族是 Linux 系统中的系统调用函数,它们都以 exec 开头,共有 6 个,分别是 execlexecleexeclpexecvexecveexecvp,使用 exec 函数可以将当前的进程替换为一个新进程,且新进程与原进程具有相同的 PID。

函数原型

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

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

参数说明

  • path:指定要执行的可执行文件及其路径,可以是相对路径、也可以是绝对路径。
  • arg:指定传递给可执行文件的一系列参数,以可变参数列表的形式,一般第一个参数为可执行文件的名称,且最后一个参数必须是 NULL
  • file:若参数中包含"/"则视为路径并在指定路径下查找可执行文件,否则将在 PATH 环境变量指定的路径中查找可执行文件。
  • envp:指定新进程的环境变量,不使用当前的环境变量。
  • argv:指定传递给可执行文件的一系列参数,以参数数组的形式,且该数组最后一个元素必须是 NULL

返回值

  • 成功:不返回,从新程序的 main 函数开始执行。
  • 失败:返回 -1,继续执行原程序。

函数区别

分别以函数中的字符 lpve 说明:

  • l:表示使用参数列表的形式传递参数。
  • p:表示使用文件名,若不指定路径,将在 PATH 环境变量指定的路径中查找可执行文件。
  • v:表示使用参数数组的形式传递参数。
  • e:表示要使用新的环境变量给新进程。

使用示例

采用参数列表传递参数,以 execl 为例

  • 示例程序
c 复制代码
// main.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("--- main begin ---\n");
    execl("./test", "test", "Hello World!", (char *)NULL);
    printf("--- main end ---\n");
    return 0;
}

// test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%s: %s \r\n", argv[0], argv[1]);
    return 0;
}
  • 执行效果如下:

采用参数数组传递参数,以 execv 为例

  • 示例程序
c 复制代码
// main.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char *argv[] = {"test", "Hello World!", (char *)NULL};
    printf("--- main begin ---\n");
    execv("./test", argv);
    printf("--- main end ---\n");
    return 0;
}

// test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%s: %s \r\n", argv[0], argv[1]);
    return 0;
}
  • 执行效果如下:

调用 PATH 下可执行文件,以 execlp 为例

  • 示例程序
c 复制代码
// main.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("--- main begin ---\n");
    execlp("ps", "ps", "-l", (char *)NULL);
    printf("--- main end ---\n");
    return 0;
}
  • 执行效果如下:

使用新的环境变量给新进程,以 execle 为例

  • 示例程序
c 复制代码
// main.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char *env_init[] = {"AA=aa", "BB=bb", NULL};
    printf("--- main begin ---\n");
    execle("./test", "test", "Hello World!", (char *)NULL, env_init);
    printf("--- main end ---\n");
    return 0;
}

// test.c
#include <stdio.h>

extern char **environ;

int main(int argc, char *argv[])
{
    printf("%s: %s \r\n", argv[0], argv[1]);
    for (char **ptr = environ; *ptr != 0; ptr++)
    {
        printf("%s\n", *ptr);
    }

    return 0;
}
  • 执行效果如下:

更多内容

相关推荐
Mr. Cao code37 分钟前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
抓饼先生1 小时前
Linux control group笔记
linux·笔记·bash
挺6的还1 小时前
25.线程概念和控制(二)
linux
您的通讯录好友2 小时前
conda环境导出
linux·windows·conda
代码AC不AC3 小时前
【Linux】vim工具篇
linux·vim·工具详解
码农hbk3 小时前
Linux signal 图文详解(三)信号处理
linux·信号处理
bug攻城狮3 小时前
Skopeo 工具介绍与 CentOS 7 安装指南
linux·运维·centos
宇宙第一小趴菜3 小时前
08 修改自己的Centos的软件源
linux·运维·centos
bug攻城狮3 小时前
彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声
linux·运维·服务器·centos·vim
XMYX-04 小时前
Linux 物理机如何区分 SSD 与 HDD ——以 DELL PERC H730 Mini 为例
linux·运维