exev函数族

2023-09-19 22:02:18

在这里插入图片描述

一.exev函数族

1.1功能

exec()函数族的主要功能是在当前进程中运行一个新的程序。使用这些函数可以实现以下功能:

  1. 程序替换(Program Replacement):调用exec()函数后,当前进程的代码和数据会被新程序的代码和数据替换。这可以用于动态加载和替换程序,使得一个进程可以切换到运行不同的程序,实现灵活的程序执行。

  2. 命令行参数传递:exec()函数族提供了不同的方式传递命令行参数给新程序。可以使用列表或数组形式将参数传递给新程序。同时,还可以在某些函数中使用可 参数。

  3. 环境变量传递:部分exec()函数族提供了传递环境变量的功能。可以通过字符串数组形式设置新程序的环境变量。

  4. 程序搜索和执行:一些exec()函数(如execvp()execlp())会自动搜索可执行文件的路径,无需指定完整路径。它们会根据环境变量PATH中指定的路径,搜索并执行指定的程序。

  5. 进程间传递状态信息:通过执行新程序,可以将一些状态信息以特定的方式传递给新程序。这样可以在进程间共享数据和状态,并实现进程间的通信。

需要注意的是,exec()函数族在成功执行后,不会返回到原来的程序。新程序的代码开始执行,原来的进程被完全替换。因此,通常在exec()函数调用后紧跟exit()函数,以确保原来的程序在替换后退出。

1.2函数原型

exec()函数族的函数原型如下:

  1. int execl(const char *path, const char *arg0, ... /*, (char *)0 */);

    • path:要执行的可执行文件的路径。
    • arg0:可执行文件的名称,作为参数传递给新程序。
    • 可变参数:新程序的命令行参数,以空指针(char *)0结尾。
  2. int execv(const char *path, char *const argv[]);

    • path:要执行的可执行文件的路径。
    • argv:新程序的命令行参数,以字符串数组形式传递,其中第一个字符串是可执行文件的名称。
  3. int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp[] */);

    • path:要执行的可执行文件的路径。
    • arg0:可执行文件的名称,作为参数传递给新程序。
    • 可变参数:新程序的命令行参数,以空指针(char *)0结尾。
    • envp:新程序的环境变量,以字符串数组形式传递。
  4. int execvp(const char *file, char *const argv[]);

    • file:要执行的可执行文件的名称,不包含路径。
    • argv:新程序的命令行参数,以字符串数组形式传递,其中第一个字符串是可执行文件的名称。
  5. int execve(const char *file, char *const argv[], char *const envp[]);

    • file:要执行的可执行文件的路径。
    • argv:新程序的命令行参数,以字符串数组形式传递。
    • envp:新程序的环境变量,以字符串数组形式传递。

这些函数返回值为-1表示执行出错。成功执行exec()函数后,当前进程的代码和数据将被新程序的代码和数据替换,并开始执行新程序。

1.3后缀含义

exec()函数族有一些不同的后缀,用于表示不同的功能和参数形式。下面是一些常见的后缀:

  1. l:表示使用列表(list)形式的参数。接收一系列用空格分隔的命令行参数作为参数传递给新程序。

  2. v:表示使用数组(vector)形式的参数。接收一个字符串数组作为参数传递给新程序,其中包含程序名称和命令行参数。

  3. p:表示通过路径(path)搜索程序。会根据环境变量PATH中指定的路径搜索并执行指定的程序。

  4. e:表示接收环境变量(environment)参数。可以指定新程序运行时的环境变量,以字符串数组形式传递。

  5. x:表示接收完整的参数列表。除了接收程序路径和命令行参数外,还可以指定新程序运行时的环境变量。

这些后缀可以结合使用,来达到所需的功能和参数形式。例如,execlp()函数接收一个程序名称和一系列的命令行参数,并会在PATH环境变量指定的路径中搜索该程序进行执行。

需要注意的是,exec()函数族中并没有具有无后缀的exec()函数,因为这样的函数原则上无法确定参数列表的长度。所以,我们需要使用带有具体后缀的函数来适应不同的参数形式和需求。
1.4函数案例

execl:

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

int main() {
    printf("This is the original program\n");
    
    // 使用execl函数族调用ls命令
    execl("/bin/ls", "ls", "-l", NULL);
    
    printf("This line will not be executed\n");
    
    return 0;
}

execlp:

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

int main() {
    printf("This is the original program\n");
    
    // 使用execl函数族调用ls命令
    execlp("ls", "ls", "-l", NULL);
    
    printf("This line will not be executed\n");
    
    return 0;
}

execv:

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

int main() {
    printf("This is the original program\n");
    char *buf[]={ "ls", "-l", NULL};
    // 使用execl函数族调用ls命令
    execv("/bin/ls",buf);
    
    printf("This line will not be executed\n");
    
    return 0;

}

exeve

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

int main() {
    char *args[] = { "/path/to/my_executable", "arg1", "arg2", NULL };
    char *env[] = { "ENV_VAR1=value1", "ENV_VAR2=value2", NULL };
    
    printf("This is the original program\n");
    
    // 使用execve函数族执行自定义可执行文件,并传递环境变量
    execve("/path/to/my_executable", args, env);
    
    printf("This line will not be executed\n");
    
    return 0;
}
更多推荐

Flask狼书笔记 | 08_个人博客(上)

文章目录8个人博客8.1大型项目结构8.2编写程序骨架8.3编写博客前台8个人博客个人博客是一个典型的CMS(内容管理系统),通常包含前台和后台两部分。这一张将涉及更高级的项目组织方式,以及一些新的Python包:Flask-Login,Unidecode。8.1大型项目结构本章将学习使用蓝本,和工厂函数,来进一步组织

设计模式:策略模式

目录组件代码示例源码中应用优缺点总结策略模式(StrategyPattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。策略模式通过将算法封装成独立的策略类,使得它们可以互相替换,而不影响客户端的使用。组件在策略模式中,有三个核心组件:策略接口(StrategyInterface):定义了

ARTS打卡第三周

概述infoq的arts打卡学习,贯彻左耳朵耗子的学习理念,活到老学到老,每天都精进一点,上个星期没有写打卡文档,只能用工作太忙为借口为自己开脱了一、Algorithm一道算法题最近工作使用算法场景较少,基本上是基于数据统计对系统进行优化,因此结合工作的算法暂时没有,最近在学习go,就用go来写一些经典算法吧,再配上单

机器学习实战:Python基于LR线性回归进行预测(十)

文章目录1前言1.1LR的介绍1.2LR的应用2.weather数据集实战演示2.1导入函数2.2导入数据2.3数据整体可视化2.4训练模型2.5预测模型2.6评估模型3.讨论1前言注意这里的LR指的是LinearRegression,线性回归。而非逻辑回归LogisticRegression,虽然二者简称都是LR,但

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南Part4第二步:反馈的技术实践14.建立能发现并解决问题的遥测系统14.1建设集中式监控架构14.2建立生产环境的应用程序日志遥测14.3使用遥测指导问题的解决14.4将建立生产遥测融入日常工作14.5建立自助访问的遥测和信息辐射器14.6发现和填补遥测的盲区14.6.1应用程序和业务度量指标14

【窗体】Winform两个窗体之间通过委托事件进行值传递,基础篇

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试!在实际项目中,我们可能会用到一些窗体做一些小工具或者小功能。比如:运行程序,在主窗体A基础上,点击某个按钮希望能够弹出B窗体,在B窗体完成操作后,希望能够把值传递回到A窗体,然后进行其他业务操作。目录一、显示线上图片二、显示本地图片三、A窗体打开B窗

西瓜书读书笔记整理(六)—— 第六章 支持向量机

第六章支持向量机6.1间隔与支持向量6.1.1什么是支持向量机6.1.2支持向量与间隔6.1.3支持向量机的求解过程6.2对偶问题(dualproblem)6.2.1什么是对偶问题6.2.2如何求解支持向量机的对偶问题6.3核函数(kernelfunction)6.3.1什么是支持向量机的核函数6.3.2常见的几种核函

[NLP] LLM---<训练中文LLama2(五)>对SFT后的LLama2进行DPO训练

当前关于LLM的共识大型语言模型(LLM)使NLP中微调模型的过程变得更加复杂。最初,当ChatGPT等模型首次出现时,最主要的方法是先训练奖励模型,然后优化LLM策略。从人类反馈中强化学习(RLHF)极大地推动了NLP的发展,并将NLP中许多长期面临的挑战抛在了一边。基于人类反馈的强化学习(Reinforcement

算法通关村-----数组中元素出现次数问题

数组中出现次数超过一半的数字问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。详见剑指offer39问题分析最直接的方式就是使用hashMap,遍历给定数组,将数字和对应出现次数存储在hashMap中,然后再遍历hashMap,找到出现次数最大

代码随想录算法训练营第三十八天|理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

理论基础无论大家之前对动态规划学到什么程度,一定要先看我讲的动态规划理论基础。如果没做过动态规划的题目,看我讲的理论基础,会有感觉是不是简单题想复杂了?其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!如果做过动态规划题目的录友,看我的理论基础就会感同身受了。代码随想录视频:从此再也不怕动态规划了

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章:https://blog.csdn.net/Phoenix_zxk/article/details/132917657篇幅太大,所以分开写,接下来续上4.3.3.2.1设备要求:Guest->Host通知设备必须忽略GPR2的位0-31(从左边数)。这样可以使子通道ID的传递方式与现有的I/O指令传递方式保持

热文推荐