一文弄懂 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;
}
  • 执行效果如下:

更多内容

相关推荐
努力的小T1 小时前
基于 Bash 脚本的系统信息定时收集方案
linux·运维·服务器·网络·云计算·bash
梓懿lwh2 小时前
vim的介绍
linux·编辑器·vim
爱敲代码的边芙2 小时前
Linux:信号的保存[2]
linux·运维·服务器
工程师焱记2 小时前
Linux 常用命令——系统设置篇(保姆级说明)
linux·运维·服务器
某风吾起3 小时前
linux系统中的 scp的使用方法
linux·服务器·网络
『往事』&白驹过隙;3 小时前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统
chian-ocean3 小时前
探索Linux中的进程控制:从启动到退出的背后原理
linux·运维·服务器
涛ing3 小时前
23. C语言 文件操作详解
java·linux·c语言·开发语言·c++·vscode·vim
阿猿收手吧!3 小时前
【Linux网络总结】字节序转换 收发信息 TCP握手挥手 多路转接
linux·服务器·网络·c++·tcp/ip
萤火夜4 小时前
Linux网络之TCP
linux·网络·tcp/ip