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

更多内容

相关推荐
小黑爱编程4 分钟前
【LInux】HTTPS是如何实现安全传输的
linux·安全·https
BeyondESH9 分钟前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
鱼饼6号24 分钟前
Prometheus 上手指南
linux·运维·centos·prometheus
Asher Gu30 分钟前
Linux系统编程入门 | 模拟实现 ls -l 命令
linux
c无序1 小时前
【Linux进程控制】进程程序替换
linux
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
CoolTiger、6 小时前
【Vmware16安装教程】
linux·虚拟机·vmware16
学习3人组7 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神8 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0668 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构