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

更多内容

相关推荐
神梦流14 分钟前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫16 分钟前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
wdfk_prog22 分钟前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
xuhe238 分钟前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
Lsir10110_1 小时前
【Linux】进程信号(下半)
linux·运维·服务器
酉鬼女又兒1 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
zl_dfq1 小时前
Linux 之 【多线程】(pthread_xxx、轻量级进程、原生线程库、线程ID、__thread、线程栈、线程与信号、线程与程序替换)
linux
choke2331 小时前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
AZ996ZA2 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php