执行新程序 execve()

article/2025/8/12 15:22:34

新程序的执行

一:execve()

之所以叫新程序的执行,原因是这部分内容一般发生在fork()vfork()之后,在子进程中通过系统调用execve()可以将新程序加载到子进程的内存空间。这个操作会丢弃原来的子进程execve()之后的部分,而子进程的栈、数据会被新进程的相应部分所替换。即除了进程ID之外,这个进程已经与原来的进程没有关系了。
举个例子:在shell(shell也是一个进程)中执行最简单的HelloWorld程序。它也是首先调用execve()这个系统调用的,下面用strace跟踪下执行HelloWorld的过程,我们可以看到第一步执行的是execve()。省略了后面信息,如图:
这里写图片描述
实际上Hello进程的父进程是shell进程,它是shell进程fork出来的一个子进程然后执行execve之后在执行的Hello,所以我们下面来看看这个execve:

#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);
  • filename:包含准备载入当前进程空间的新程序的路径名。既可以是绝对路径,又可以是相对路径。
  • argv[]:指定了传给新进程的命令行参数,该数组对应于c语言main函数的argv参数数组,格式也相同,argv[0]对应命令名,通常情况下该值与filename中的basename(就是绝对路径的最后一个)相同。
  • envp[]:最后一个参数envp指定了新程序的环境列表。参数envp对应于新程序的environ数组。

还要注意的是:由于是将调用进程取而代之,因此对execve的调用将永远不能返回,也无需检查它的返回值,因为该值始终为-1,实际上,一旦返回就表明了错误,通常会有error值来判断,下面是几个常用的:
- EACCES:参数pathname没有指向一个常规文件,未对该文件赋于可执行权限,或者因为目录没有x权限。
- ENOTNT:pathname指定的文件并不存在。
- ETXTBSY:存一个或者多个进程已经以写入的方式打开pathname所指定的文件。

下面我们举个例子说明execve的用法:
filename:execve.c

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>int main(int argc,char *argv[])
{char *argVec[10];                               //参数数组char *envVec[] = {"环境参数1","环境参数2",NULL};  //环境变量数组argVec[0] = argv[1];argVec[1] = "hello world";argVec[2] = "goodbye";execve(argv[1],argVec,envVec);        //分别传入三个参数return 0;
}

filename:envargs.c

#include<stdio.h>
#include<stdlib.h>
extern char ** environ;
int main(int argc,char *argv[])          //argv[]相当于上面的argvec[]
{int j;char **ep;for(j = 0;j < argc;j++) {printf("argv[%d] = %s\n",j,argv[j]);}for(ep = environ;*ep != NULL;ep++) {    //environ是上面的envVec[]printf("environ:%s\n",*ep);}exit(EXIT_SUCCESS);return 0;
}

这里写图片描述

二:exec()函数族

实际上有关exec是一个函数族,包括execle,execlp,execvp,execv,execl但是他们具体的实现都是调用execve()之上。它们的区别就在于对路径名,参数以及环境变量的指定上。下面分别从这三个方面来区分这几个函数:
- 路径名:带p的表示可以通过环境变量PATH去查找,所以我们可以不用绝对路径,比如execlp和execvp就可以直接用filename。
- 参数:带l的execle()和execlp()以及execl()要求在调用中以字符串形式指定参数。首个参数相当于新程序main中的argv[0],因而通常与filename中的basename相同(就是绝对路径的最后一个)。
- 环境变量:以e结尾的允许我们通过envp为新程序显式的指定环境变量,其中envp必须以NULL结尾。

下面我们通过这个表格来介绍exec()函数族之间的差异:

函数执行程序文件参数环境变量
execve()路径名数组envp参数
execle()路径名列表envp数组
execlp()文件名列表调用者environ
execvp()文件名数组调用者environ
execv()路径名数组调用者environ
execl()路径名列表调用者environ

http://chatgpt.dhexx.cn/article/7WdEf8XO.shtml

相关文章

简单的execve流程

本文转载于网络 基于Linux0.11源码来叙述该功能&#xff0c;源码可以在oldlinux.org上自行获取 _sys_execve:lea EIP(%esp),%eax #取堆栈中存放系统调用的返回地址的地址pushl %eax #将该地址入栈call _do_execve #调用do_execve函数addl $4,%esp #丢弃该地址ret这边做了一个很…

Linux0.11系统调用之execve流程解析

Linux0.11系统调用之execve流程解析 前言execve功能介绍execve本质execve系统调用流程总结 前言 本文是基于Linux0.11源码来叙述该功能&#xff0c;源码可以在oldlinux.org上自行获取。 execve功能介绍 execve是用于运行用户程序&#xff08;a.out&#xff09;或shell脚本的…

5.execve()到底干了啥?

导语 很多童鞋有分析阅读Linux源代码的强烈愿望&#xff0c;可是Linux内核代码量庞大&#xff0c;大部分人不知道如何下手&#xff0c;以下是我分析Linux源代码的一些经验&#xff0c;仅供参考&#xff0c;有不实之处请大神指正&#xff01; 1.要想阅读内核首先要进入内核&…

Linux系统编程(再论execve)

文章目录 前言一、execve的第三个参数二、进程空间三、命令行参数规范四、optstring规则的扩展定义总结 前言 本篇文章我们继续来研究一下execve这个系统调用&#xff0c;上篇文章已经讲解了前两个参数的意义了&#xff0c;那么这篇文章就来讲解一下第三个参数的具体含义。 一…

Linux0.11 execve函数(六)

系列文章目录 Linux 0.11启动过程分析&#xff08;一&#xff09; Linux 0.11 fork 函数&#xff08;二&#xff09; Linux0.11 缺页处理&#xff08;三&#xff09; Linux0.11 根文件系统挂载&#xff08;四&#xff09; Linux0.11 文件打开open函数&#xff08;五&#xff09…

C语言 execve()函数使用方法

1.君の名は execve() – 叫做执行程序函数 就像Python中的os.system(cmd)这个函数&#xff0c;我们可以用这个函数来执行我们的shell脚本&#xff0c;单独的shell命令&#xff0c;或者是调用其他的程序&#xff0c;我们的execve()这个函数就和Python中的os.system函数类似&am…

SPSS-因子分析

因子分析 有可能用较少的综合指标分析存在于各变量中的各类信息&#xff0c;而各综合指标之间彼此是不相关的&#xff0c;代表各类信息的综合指标称为因子。定义&#xff1a;因子分析就是用少数几个因子来描述许多指标或因素之间的联系&#xff0c;以较少几个因子反映原资料的 …

spss进行主成分分析

什么是主成分分析 简而概之, 就是一组数据受太多因素影响, 选出几个能代表他们的因素,并进行线性组合得到一组比原维度小的因素组合, 作为新的因素集 用spss操作 随手拿出一组数据 1.数据统一标准化 因为我们得到的原始数据大小,类型不一, 一起分析会不准确, 所以将数据全部…

实用干货!因子分析超全步骤总结

因子分析是统计数据分析方法之一&#xff0c;因子分析包括探索性因子分析和验证性因子分析。本文主要讨论探索性因子分析。 一、研究背景 关于工作满意度有14个问题&#xff0c;调研得到215份问卷结果。希望通过因子分析&#xff0c;用少量因子反映14个题目的信息&#xff0c;…

NLP | 朴素贝叶斯法的学习与分类

朴素贝叶斯法的学习与分类 《统计学习方法》李航第四章 1、概述 书上对朴素贝叶斯的描述如下&#xff1a; 朴素贝叶斯法时基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入/输出的联合概率分布&#xff1b;然…

标定相机参数-张正友方法

一、实验原理 1.计算外参 设三维世界坐标的点为M=[X,Y,Z,1]T,二维相机平面像素坐标为m=[u,v,1]T,所以标定用的棋盘格平面到图像平面的单应性关系为: sm=A[R,t]M 其中 不妨设棋盘格位于Z = 0,定义旋转矩阵R的第i列为 ri, 则有: 令H=[h1 h2 h3]=λA[r1 r2 t] 于是空间到图…

《统计学习方法》——朴素贝叶斯法

引言 朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。朴素贝叶斯法实现简单&#xff0c;学习与预测的效率都很高&#xff0c;是一种常用的方法。 这一章需要大量的概率论知识&#xff0c;忘记了的同学建议先参阅人工智能数学基础之概率论。 朴素贝…

数据挖掘十大算法之 naïve Bayes

朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的分类方法。朴素贝叶斯法实现简单&#xff0c;学习与预测的效率都很高&#xff0c;被广泛应用于文本分类、垃圾邮件过滤、自然语言处理等场景。下面我们来介绍贝叶斯定理&#xff0c;在介绍贝叶斯定理之前&#xff0c;先介绍下…

专题:深度神经网络基本问题的原理详细分析和推导

文章目录 **写在最前面****1 神经网络算法的直观了解****1.1 神经网络过程描述**&#xff1a;**1.2 神经网络相关的几个问题****1.2.1 表征假设和激活函数** **1.2.2 结构设计(Architecture Design)****1.2.3 代价函数(Cost Function)和优化目标(Optimization objective)****1.…

第四章 朴素贝叶斯法

文章目录 朴素贝叶斯法的学习与分类基本方法数据定义学习联合概率分布如何求出条件概率分布&#xff1f;如何分类&#xff1f; 后验概率最大化的含义 朴素贝叶斯的参数估计法极大似然估计学习分类算法贝叶斯估计 朴素贝叶斯法&#xff08;与贝叶斯估计是不同的概念&#xff09;…

GAN生成对抗式神经网络数学推导

由上面一篇文章我们已经知道了&#xff0c;如果我们从真实数据分布里面取n个样本&#xff0c;根据给定样本我们可以列出其出现概率的表达式&#xff0c;那么生成这N个样本数据的似然(likelihood)就是 l ( θ ) ∏ i 1 N p ( x i ∣ θ ) l ( \theta ) \prod _ { i 1 } ^ { …

《统计学习方法》学习笔记(三)之 朴素贝叶斯法

朴素贝叶斯法 总述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征独立性假设学习输入/输出的联合概率分布&#xff1b;然后基于此模型&#xff0c;对给定的输入 x x x&#xff0c;利用贝叶斯定理求出后验概率最…

朴素贝叶斯(二)|极大似然估计+学习与分类算法+贝叶斯估计| 《统计学习方法》学习笔记(十六)

朴素贝叶斯法的参数估计 1. 极大似然估计 在朴素贝叶斯法中&#xff0c;学习意味着估计 P ( Y c k ) P(Yc_k) P(Yck​)和 P ( X ( j ) x ( j ) ∣ Y c k ) P(X^{(j)}x^{(j)}|Yc_k) P(X(j)x(j)∣Yck​)。可以应用极大似然估计法估计相应的概率。先验概率 P ( Y c k ) P(Yc…

一文看懂 “极大似然估计” 与 “最大后验估计” —— 最大后验估计篇

本文历次修订后全长 2万8000余字&#xff0c;受到 CSDN 博文字数限制&#xff0c;故切分两篇发布&#xff0c;所以现在是两文看懂了… 前篇介绍参数估计背景和极大似然估计&#xff1b;本篇介绍最大后验估计和两种方法对比请务必先看前文&#xff1a;一文看懂 “极大似然估计”…

【生成模型】极大似然估计,你必须掌握的概率模型

上一期为大家说明了什么是无监督生成模型。在无监督生成模型中&#xff0c;极大似然法一直扮演着非常核心的位置&#xff0c;我们必须对它有深刻的理解&#xff0c;本期小米粥将为大家讲一下极大似然法的那些事情。 作者&编辑 | 小米粥 1 一个小游戏&#xff1a;取球猜概率…