【linuxC语言】exec函数族

文章目录

  • 前言
  • 一、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系统的资源,编写出更加灵活、高效的程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android(Java)项目支持Kotlin语言开发

Android&#xff08;Java&#xff09;项目通过相关Kotlin设置后&#xff0c;允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项&#xff1a; 第一步&#xff1a;在项…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Sentinel 控制台学习

引言 上篇文章已经讲过 SpringCloud Sentinel集成到微服务项目中&#xff0c;接下来我们继续学习怎么使用sentinel控制台对微服务进行限流&#xff0c;熔断&#xff0c;降级等一系列操作。 控制台 接下来我们单独讲解每一个菜单按钮 实时监控 实时监控&#xff1a; 可以看到…

必应广告投放怎么做?怎么开户推广?

今天搜索引擎广告依旧是企业提升品牌知名度、吸引潜在客户的关键渠道之一&#xff0c;必应Bing&#xff0c;作为全球第二大搜索引擎&#xff0c;不仅拥有庞大的用户基础&#xff0c;更以其精准的定向能力和高效的转化效率&#xff0c;成为众多企业拓展市场的优选平台。 一、必…

【Java探索之旅】包管理精粹 Java中包的概念与实践

文章目录 &#x1f4d1;前言一、封装1.1 封装的概念1.2 访问限定修饰符 二、封装扩展&#xff08;包&#xff09;2.1 包的概念2.2 带入包中的类2.3 自定义包2.4 常见的包 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;封装是面向对象编程的核心概念之一…

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

【R语言数据分析】数据类型与数据结构

R的数据类型有数值型num&#xff0c;字符型chr&#xff0c;逻辑型logi等等。 R最常处理的数据结构是&#xff1a;向量&#xff0c;数据框&#xff0c;矩阵&#xff0c;列表。 向量有数值型向量&#xff0c;字符型向量&#xff0c;逻辑型向量等&#xff0c;字符型向量就是反应…

二维码门楼牌管理应用平台建设:实现用户权限的高效管理

文章目录 前言一、用户权限管理的重要性二、用户管理中心的构建三、用户权限管理的实施策略四、用户权限管理的挑战与应对五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台已成为城市管理的重要组成部分。本文将深入探讨如何通过用户权限管理&#…

基于SpringBoot+Vue外卖系统设计和实现(源码+LW+部署讲解)

&#x1f339;作者简介&#xff1a;✌全网粉丝10W&#xff0c;csdn特邀作者、博客专家、Java领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战&#xff0c;高校老师/讲师/同行前辈交流✌ &#x1f339; 主要…

STM32(c语言基础)

1.硬件部分&#xff1a;按键&#xff0c;传感器 传感器模块&#xff1a;光敏电阻&#xff0c;热敏电阻&#xff0c;红外接收管 光敏电阻&#xff1a;光线越强&#xff0c;光敏电阻的阻值就越小&#xff1b; 热敏电阻&#xff1a;温度越高&#xff0c;热敏电阻的阻值越小&…

Vitis HLS 学习笔记--AXI4 主接口

目录 1. 简介 2. 认识MAXI 3. MAXI突发操作 3.1 全局/本地存储器 3.2 MAXI优势与特点 3.3 查看MAXI报告 3.3.1 HW Interfaces 3.3.2 M_AXI Burst Information 3.4 MAXI 资源消耗 4. 理解 Volatile 4.1 标准C/C中的 volatile 4.2 HLS 中的 volatile 5. 总结 1. 简介…

Blog图床

img avatar Audrey.webp icon.png personal.webp

labview强制转换的一个坑

32位整形强制转换成枚举的结果如何&#xff1f; 你以为的结果是 实际上的结果是 仔细看&#xff0c;枚举的数据类型是U16&#xff0c;"1"的数据类型是U32&#xff0c;所以转换产生了不可预期的结果。所以使用强制转换时一定要保证两个数据类型一致&#xff0c;否则…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

【学习AI-相关路程-工具使用-NVIDIA SDK MANAGER==NVIDIA-jetson刷机工具安装使用 】

【学习AI-相关路程-工具使用-NVIDIA SDK manager-NVIDIA-jetson刷机工具安装使用 】 1、前言2、环境配置3、知识点了解&#xff08;1&#xff09;jetson 系列硬件了解&#xff08;2&#xff09;以下大致罗列jetson系列1. Jetson Nano2. Jetson TX23. Jetson Xavier NX4. Jetson…

Hi3519AV100 处理器⾼速全局快⻔相机

⾼速全局快⻔相机采⽤ 1英⼨全局快⻔ Sensor&#xff0c;⽀持 H.264/H.265 编码&#xff0c;8 百万 分辨率模式下最⾼帧率可达 50 帧/秒&#xff0c;1080P 模式下最⾼帧率可达 120 帧/秒。主控采⽤ Hi3519AV100 处理器&#xff0c;集成 2 Tops AI 算⼒ NPU &#xff0c;⽀持⼤…

华为5700配置

恢复出厂设置&#xff0c;清空配置 1、更改名字 system-view sysname tp-10-50-01-04 2、配置管理接口 int vlan 1 ip add 10.50.1.4 255.255.254.0 quit 2、链路汇聚 interface eth-trunk 1 mode lacp quit 3、绑定端口 interface eth-trunk 1 trunkport gigabitethernet …

制作一个 rpm 软件包

首发日期 2024-04-30, 以下为原文内容: 本文以 ibrus (艾刷, 胖喵拼音 ibus 接口模块) 为例, 介绍 rpm 软件包的制作过程. 相关文章: 《发布 AUR 软件包 (ArchLinux)》 https://blog.csdn.net/secext2022/article/details/136803790《多种双拼方案的实现》 https://blog.csdn.…

Redisson分布式锁,重试锁和锁续命的原理

RedissonLock 锁重试原理 tryLock有三个三个参数&#xff0c;第一个是等待时间&#xff0c;第二个是锁失效后自动释放的时间,不填默认为-1&#xff0c;第三个是时间单位&#xff1b; 当设置了第一个参数&#xff0c;那这个锁就成了可重试锁&#xff1b;获取锁失败后&#xff0c…

人工智能|深度学习——多模态条件机制 Cross Attention 原理及实现

一、引入 虽然之前写过 Attention 的文章&#xff0c;但现在回头看之前写的一些文章&#xff0c;感觉都好啰嗦&#xff0c;正好下一篇要写的 Stable Diffusion 中有 cross-attention&#xff0c;索性就再单拎出来简单说一下 Attention 吧&#xff0c;那么这篇文章的作用有两个&…