【linuxC语言】exec函数族

news2024/10/5 21:19:32

文章目录

  • 前言
  • 一、exec函数族
  • 二、示例代码
    • 2.1 代码1
    • 2.2 代码2
    • 2.3 代码3
  • 总结


前言

在Linux环境下,C语言提供了一组强大的函数族,即exec函数族,用于执行其他程序。这些函数允许程序在运行时加载并执行不同的程序,从而实现了程序之间的无缝交互和协作。本文将介绍exec函数族的基本概念、使用方法以及示例代码,帮助读者更好地理解和利用这些函数。


一、exec函数族

函数原型:

#include <unistd.h>

int execl(const char *path, const char *arg0, ... /* (char *) NULL */);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ... /* (char *) NULL, char *const envp[] */);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ... /* (char *) NULL */);
int execvp(const char *file, char *const argv[]);

作用:

exec函数族用于在当前进程中加载并执行其他程序,替换当前进程的内存映像。它们允许程序在运行时加载不同的程序,实现程序之间的无缝交互和协作。

参数:

path:要执行的程序的路径或名称。
arg0, …:要传递给新程序的参数列表,以及 NULL 作为结束标志。
argv[]:参数数组,包含程序名和参数,以及 NULL 作为结束标志。
envp[]:环境变量数组,每个元素是形如 “key=value” 的字符串,以及 NULL 作为结束标志。
file:要执行的程序的名称,用于在系统的 PATH 环境变量中搜索可执行文件。
返回值:

如果函数执行成功,则不返回,而是加载并执行了新的程序,因此不会有返回值。
如果函数执行失败,则返回 -1,并设置全局变量 errno 表示错误类型。

这六个函数族在功能上基本相同,但它们在接受参数和使用方式上有所不同:

execl() 和 execle():这两个函数接受可变数量的参数,用于传递给新程序的参数列表,最后一个参数必须是 NULL。execle() 还额外接受一个环境变量参数。
execv() 和 execve():这两个函数接受一个参数数组,用于传递给新程序的参数列表,数组的最后一个元素必须是 NULL。execve() 还额外接受一个环境变量参数。
execlp() 和 execvp():这两个函数与 execl() 和 execv() 类似,但它们会在系统的 PATH 环境变量中查找可执行文件。
因此,选择使用哪个函数取决于你的需求和偏好。如果你需要指定明确的文件路径,可以使用 execl()、execle()、execv() 或 execve();如果你希望在系统的 PATH 中查找可执行文件,可以使用 execlp() 或 execvp()。如果你需要传递环境变量,则需要使用带有 ‘e’ 的函数,即 execle() 和 execve()。

二、示例代码

2.1 代码1

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 使用 execl() 函数加载并执行 ls 命令
    execl("/bin/ls", "ls", "-l", NULL);

    // 如果 execl() 执行成功,下面的代码将不会执行
    perror("execl"); // 输出错误信息
    return -1;
}

| 在这里插入图片描述

2.2 代码2

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 使用 execvp() 函数加载并执行 ls 命令
    execvp("ls", args);

    // 如果 execvp() 执行成功,下面的代码将不会执行
    perror("execvp"); // 输出错误信息
    return -1;
}

在这里插入图片描述

2.3 代码3

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 准备环境变量数组
    char *env[] = {"PATH=/usr/local/bin", "LANG=en_US.UTF-8", NULL};

    // 使用 execve() 函数加载并执行 ls 命令,并传递环境变量
    execve("/bin/ls", args, env);

    // 如果 execve() 执行成功,下面的代码将不会执行
    perror("execve"); // 输出错误信息
    return -1;
}

在这里插入图片描述


总结

通过本文的介绍,读者应该对Linux环境下的exec函数族有了基本的了解。exec函数族提供了多种方式来执行其他程序,包括根据文件路径执行、在系统PATH环境变量中搜索执行、传递参数和环境变量等。这些函数的灵活性和强大功能使得它们在编写C语言程序时非常有用。通过学习和掌握exec函数族,读者可以更好地利用Linux系统的资源,编写出更加灵活、高效的程序。

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

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

相关文章

spring boot 自定义starter示例

springboot 约定规范 Starter项目的命名规范 建议自定义的starter 以 xxx-spring-boot-starter 命名&#xff0c;官方的Starter一般都是以spring-boot-starter-为前缀。这样做的目的是为了避免与官方或其他第三方提供的Starter产生冲突或混淆。 Starter项目的结构规范(重要) …

详解SDRAM基本原理以及FPGA实现读写控制

文章目录 一、SDRAM简介二、SDRAM存取结构以及原理2.1 BANK以及存储单元结构2.2 功能框图2.3 SDRAM速度等级以及容量计算 三、SDRAM操作命令3.1 禁止命令&#xff1a; 4b1xxx3.2 空操作命令&#xff1a;4b01113.3 激活命令&#xff1a;4b00113.4 读命令&#xff1a;4b01013.5 写…

spring的常用注解

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Spring⛺️稳中求进&#xff0c;晒太阳 Spring框架注解&#xff1a; 给容器中注入组件 &#xff08;1&#xff09;包扫描组件标注注解 Component&#xff1a; 用于标识一个类作为组件&am…

【数据结构(十)】Map和Set

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.搜索树2.1 概念2.2实现二叉搜索树 2.4性能分析3.搜索3.Map3.1Map说明3.2 M…

【UnityRPG游戏制作】Unity_RPG项目之场景环境搭建和解析

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

图论之最短路算法模板总结

来个大致的分类&#xff1a; 朴素的迪杰斯特拉&#xff1a; 实现&#xff1a; 我们让s表示当前已经确定的最短距离的点&#xff0c;我们找到一个不在s中的距离最近的点t&#xff0c;并用t来更新其他的点。 下面是AC代码&#xff1a; #include<bits/stdc.h> using nam…

C++之const用法小结

在C中&#xff0c;const关键字具有多种用法&#xff0c;主要用于声明常量&#xff0c;确保某些变量的值在程序运行期间不会被修改。以下是const在C中的一些常见用法&#xff1a; 1.声明常量&#xff1a; 使用const声明的变量是常量&#xff0c;其值在初始化后不能再被修改。 …

关于海康相机和镜头参数的记录

对比MV-CS020-10UC和大家用的最多的MV-CS016-10UC 其实前者适合雷达站使用&#xff0c;后者适合自瞄使用 一&#xff1a;MV-CS020-10UC的参数 二&#xff1a;对比 三&#xff1a;海康镜头选型工具

mysql从入门到起飞+面试基础题

mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…

C++学习第十八课:STL中的`string`类深度解析

C学习第十八课&#xff1a;STL中的string类深度解析 在C标准模板库&#xff08;STL&#xff09;中&#xff0c;std::string是一个提供了大量功能和操作的类&#xff0c;用于处理和存储字符串数据。std::string不仅包含了传统的C风格字符串&#xff08;如char*&#xff09;所提…

算法二:DOM - 将DOM节点元素转换成JSON字符串

题目&#xff1a; 将DOM节点元素转换成JSON的格式 例如 <div class"root"><div class"child1"><p></p></div><span></span><div><div><p></p></div></div><p></…

XY_RE复现(六)

馒头 考数据结构的好像 有一个建树的函数 __int64 __fastcall initHuffmanTree(void **a1) {__int64 v1; // rcx__int64 v2; // rdxchar v4; // [rsp27h] [rbp-9h]int j; // [rsp28h] [rbp-8h]int i; // [rsp2Ch] [rbp-4h]*a1 malloc(0x3C0ui64);for ( i 1; i < 47; i )…

OpenGL 入门(一)—— OpenGL 基础

1、OpenGL 基础知识 1.1 OpenGL 简介 OpenGL&#xff08;Open Graphics Library&#xff09;是图形领域的工业标准&#xff0c;是一套跨编程语言、跨平台、专业的图形编程&#xff08;软件&#xff09;接口。它用于二维、三维图像&#xff0c;是一个功能强大&#xff0c;调用…

一个C++小程序调试过程记录

Top 20 C Projects With Source Code [2024 Update]https://www.interviewbit.com/blog/cpp-projects/ 这个网页有一些简单的C程序的源码&#xff0c;闲来无事&#xff0c;把第一个程序&#xff08;Bookshop Management System Using C&#xff09;的源码下载了下来。 源文件…

在 Vue.js 2.x 中使用 WebSocket 与 Spring Boot 2.7 实现通信

前言&#xff1a;近期在研究远程遥控空调&#xff0c;需要通过接口记录前端的一些动作&#xff0c;那么前端需要实现主动通知接口&#xff0c;并接收来自接口的通知。 一、方案 通过在Vue.js 2.x 中使用 WebSocket 与 Spring Boot 2.7 实现通信&#xff0c;使用 STOMP&#xf…

【openLooKeng集成Hive连接器完整过程】

【openLooKeng集成Hive连接器完整过程】 一、摘要二、正文2.1 环境说明2.2 Hadoop安装2.2.1. 准备工作2.2.2 在协调节点coordinator上进行安装hadoop2.2.3、将Hadoop安装目录分发到从节点worker2.2.4、在协调节点coordinator上启动hadoop集群2.3 MySQL安装2.4 Hive安装及基本操…

LabVIEW智能变电站监控系统设计与实现

LabVIEW智能变电站监控系统设计与实现 随着电力系统和智能化技术的快速发展&#xff0c;建立一个高效、可靠的变电站监控系统显得尤为重要。通过分析变电站监控系统的需求&#xff0c;设计了一个基于LabVIEW软件的监控平台。该平台利用虚拟仪器技术、传感器技术和无线传输技术…

从C到Py:Python的异常处理

本篇文章中我们将简单讲解一下有关Python中的异常处理&#xff0c;既有在代码中有显式表达的异常处理语法&#xff0c;还包括Pycharm手动调试的简单操作。 目录 Python异常处理 1、try-except结构 ​编辑 2、try-except-else结构 raise抛出异常 常见异常类型 Pycharm程序…

神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数&#xff1a;理解与实践 在神经网络中&#xff0c;激活函数是一个非常重要的组成部分&#xff0c;它为神经元引入了非线性特性&#xff0c;使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数&#xff0c;包括它们的概述、公式以及…

安卓中级控件(图形、选择按钮、文本输入、对话框)

图形定制 图形Drawable Android把所有能够显示的图形都抽象为Drawable类&#xff08;可绘制的&#xff09;。这里的图形不止是图片&#xff0c;还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下&#xff0c;其中drawable目录一般保存描述性…