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

news2025/1/22 12:49:07

目录

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

简介

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

函数原型

#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 为例

  • 示例程序
// 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 为例

  • 示例程序
// 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 为例

  • 示例程序
// 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 为例

  • 示例程序
// 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;
}
  • 执行效果如下:

更多内容

  • CSDN博客:@Hello阿尔法
  • 哔哩哔哩:@Hello阿尔法
  • 知乎:@Hello阿尔法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

【计算机毕业设计】基于微信小程序高校寻物平台

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于 微信小程序的高校寻物平台的开发全过程。通过分析基于微信小程序的高校寻物平台管理的不足&#xff0c;创建了一个计算机管理基于微信小程序的高校寻物平台的方案…

找不到d3dx9_42.dll无法继续执行代码的原因分析及解决方法

当您在使用电脑过程中遇到提示“缺少d3dx9_42.dll”时&#xff0c;这实际上是操作系统在运行某些应用程序或游戏时遇到的一个常见问题。D3DX9_42.dll是DirectX 9的一部分&#xff0c;DirectX是一组由微软开发的多媒体处理软件组件&#xff0c;广泛用于提升游戏与多媒体程序的性…

智慧公厕解决了什么问题?

在现代城市生活中&#xff0c;公厕是一个不可忽视的环节。然而&#xff0c;过去的公共厕所常常存在管理不力、环境脏乱差等问题&#xff0c;给人们的生活带来了许多不便和困扰。为了解决这些问题&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所使用、运行、管理、养护…

每日两题 / 101. 对称二叉树 230. 二叉搜索树中第K小的元素(LeetCode热题100)

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 用两个指针同时遍历树的左右子树即可 每次遍历时&#xff0c;一个指针向左&#xff0c;另一个就要向右。一个向右&#xff0c;另一个就要向左 /*** Definition for a binary tree node.* struct TreeNode {* in…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合&#xff08;Mixins&#xff09;4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发&#xff0c;在这个开发过程中会用到较多的接口、类、抽象类&#xff0c;它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器&#xff0c;而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

VMware配置Kali linux + 物理机连接Xshell

VMware 配置 kali linux 首先需要先安装VMware Workstation 我是在Windows 安装的 VMware Workstation Pro 17 虚拟化&#xff0c;产品密钥。。这里不做多说了 下载kali linux 这里我下载的是kali-linux-2024.1 Note&#xff1a;这里选Virtual Machines&#xff0c;建议不要…

数据分享—鄱阳湖矢量边界数据

鄱阳湖位于中国江西省北部&#xff0c;是中国最大的淡水湖泊之一&#xff0c;也是长江流域第一大湖。鄱阳湖水域广阔&#xff0c;湖区面积约为3600平方公里。鄱阳湖拥有丰富的水生生物资源&#xff0c;湖中有多种淡水鱼类和水生植物&#xff0c;是重要的渔业资源基地之一。湖泊…

RocketMQ(一)

作用 1. 限流削峰 2. 异步解耦 组成 Producer&#xff1a;消息的发送者&#xff0c;生产者&#xff1b;举例&#xff1a;发件人 Consumer&#xff1a;消息接收者&#xff0c;消费者&#xff1b;举例&#xff1a;收件人 Broker&#xff1a;暂存和传输消息的通道&#xff1…

简要介绍三大脚本语言 Shell、Python 和 Lua

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序&#xff0c;以提高任务执行的速度和效率。在众多脚本语言中&#xff0c;Shell、Python 和 Lua 是…

一竞技LOL:中韩首场对决暴露TES大问题 BLG和T1的比赛成为焦点!

北京时间5月12日,昨天结束的MSI比赛中第二场比赛是本次MSI第一场中韩大战,由LCK赛区的一号种子GEN战队对阵LPL的二号种子TES战队。TES最终是2:3非常遗憾的输给了Gen,这也意味着TES将要去败者组,本场比赛也是暴露出了TES战队比较大的问题,中单的英雄池以及上单369的状态成为TES战…

【Java】:向上转型、向下转型和ClassCastException异常

目录 先用一个生动形象的例子来解释向上转型和向下转型 向上转型&#xff08;Upcasting&#xff09; 向下转型&#xff08;Downcasting&#xff09; 向上转型 概念 例子 发生向上转型的情况 1.子类对象赋值给父类引用 2.方法参数传递 3.返回值 向下转型 概念 注意…

【数字IC设计】芯片设计中的RDC

RDC问题定义 在芯片设计中,RDC是reset domain crossing 的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错…

Java | Spring框架 | AOP代理机制

大家好&#xff0c;我是程序员影子&#xff0c;一名AI编程深耕者&#xff0c;点击左上角头像了解我的详细信息。 今天来聊一聊关于Java中的Spring AOP代理机制中的JDK动态代理与CGLIB。 一、JDK动态代理 JDK动态代理是Spring AOP默认使用的代理机制。它基于Java反射机制&…

IO:线程的同步互斥

一、引入 例&#xff1a; 要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件。 A线程循环打印buf字符串&#xff0c; B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321.…

【计算机毕业设计】基于微信小程序校友会系统的实现

由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼 管理者必须改变运营…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

GDPU JavaWeb 过滤器

再纯净的白开水也过滤不了渣茶。 Servlet登陆页面 引入数据库&#xff0c;创建用户表&#xff0c;包括用户名和密码&#xff1a;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码跟用户表匹配则视为登录成功&#xff0c;跳转到loginS…