exec系列函数

5.execve()到底干了啥? 导语 很多童鞋有分析阅读Linux源代码的强烈愿望,可是Linux内核代码量庞大,大部分人不知道如何下手,以下是我分析Linux源代码的一些经验,仅供参考,有不实之处请大神指正! 1.要想阅读内核首先要进入内核,其中用户态程序进入内核态的主要方式是int 0x80中断,搞懂这条指令的执行过程是我们学习内核的第一步; 2.Linux中 阅读详情
exec用被执行的程序完全替换调用它的程序的影像。fork创建一个新的进程就产生了一个新的PID,
exec启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,
和调用exec函数的进程一样。

int   exec…装入和运行其它程序:
int   execl(  char *pathname,char *arg0,char *arg1,...,char *argn,NULL)
int   execle( char *pathname,char *arg0,char *arg1,...,char *argn,NULL,char *envp[])
int   execlp( char *pathname,char *arg0,char *arg1,...,NULL)
int   execlpe(char *pathname,char *arg0,char *arg1,...,NULL,char *envp[])
int   execv(  char *pathname,char *argv[])
int   execve( char *pathname,char *argv[],char *envp[])
int   execvp( char *pathname,char *argv[])
int   execvpe(char *pathname,char *argv[],char *envp[])
         exec函数族装入并运行程序pathname,并将参数
          arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1
       在exec函数族中,后缀l、v、p、e添加到exec后,
       所指定的函数将具有某种操作能力
      有后缀  p时,函数可以利用DOS的PATH变量查找子程序文件。
假如你希望执行命令 /bin/cat /etc/passwd /etc/group,
    l时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
        execl( "/bin/cat","/etc/passed","/etc/group",NULL);
    v时,希望接收到一个以NULL结尾的字符串数组的指针
        char* argv[] = {"/bin/cat","/etc/passed","/etc/group",NULL}
        execv( "/bin/cat", argv );
    e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。
        envp也是一个以NULL结尾的字符串数组指针
        
   
execl(执行文件)
相关函数
    fork,execle,execlp,execv,execve,execvp
表头文件
    #include<unistd.h>
定义函数
    int execl(const char * path,const char * arg,....);
函数说明
    execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
    如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
范例
    #include<unistd.h>
main()
{
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);
}
执行
    /*执行/bin/ls -al /etc/passwd */
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 


   
execlp(从PATH 环境变量中查找文件并执行)
相关函数
    fork,execl,execle,execv,execve,execvp
表头文件
    #include<unistd.h>
定义函数
    int execlp(const char * file,const char * arg,……);
函数说明
    execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
    如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
    参考execve()。
范例
    /* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */
#include<unistd.h>
main()
{
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
执行
    -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 


   
execv(执行文件)
相关函数
    fork,execl,execle,execlp,execve,execvp
表头文件
    #include<unistd.h>
定义函数
    int execv (const char * path, char * const argv[ ]);
函数说明
    execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。
返回值
    如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
    请参考execve()。
范例
    /* 执行/bin/ls -al /etc/passwd */
#include<unistd.h>
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
execv(“/bin/ls”,argv);
}
执行
    -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 


   
execve(执行文件)
相关函数
    fork,execl,execle,execlp,execv,execvp
表头文件
    #include<unistd.h>
定义函数
    int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函数说明
    execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,
    argv要传递给程序的完整参数列表,包括argv[0],它一般是执行程序的名字;最后一个参数则为传递给执行文件的新环境变量数组。
返回值
    如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
    EACCES
1. 欲执行的文件不具有用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3.欲执行的文件或script翻译器非一般文件。
EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限

/****************************************************************************
**
**    execve.c--Illustrate the usage of execve
**
*****************************************************************************/

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

int main( void )
{
    char* args[] = { "/bin/ls", NULL };

    if ( -1 == (execve("/bin/ls", args, NULL)) )
    {
        perror( "execve" );
        exit( EXIT_FAILURE);
    }
   
    puts( "shouldn't get here" );
    exit( EXIT_SUCCESS );
}

[root@localhost src]# gcc execve.c
[root@localhost src]# ./a.out
a.out  child_fork.c  execve.c  fork.c  getpid.c 
linux系统编程之进程:exec系列函数使用 例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。用exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID。1,带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。它由shell进程传递给当前进程,再由当前进程传递给替换的新进程。 阅读详情

相关推荐

Linux系统编程(再论execve)

本篇文章我们继续来研究一下execve这个系统调用,上篇文章已经讲解了前两个参数的意义了,那么这篇文章就来讲解一下第三个参数的具体含义。将 getopt 函数的错误消息输出到 stderr(标准错误流)而不是 stdout(标准输出流)。通常情况下,错误消息会被发送到 stdout。使用 + 标志可以将错误消息重定向到 stderr,这样可以将标准输出用于其他目的。使 getopt 函数返回一个非选项参数(即不以 - 或 – 开头的参数),作为额外的非选项参数。

m0_49476241的博客 2406

Linux execve函数详解

描述execve()执行由pathname引用的程序。这会导致当前由调用进程运行的程序被一个新程序替换,该新程序具有新初始化的堆栈、堆和(已初始化和未初始化)数据段。pathname必须是二进制可执行文件或以形式为开头的脚本。argv是传递给新程序作为其命令行参数的字符串指针数组。按照惯例,这些字符串中第一个(即argv[0])应包含与正在执行文件相关联的文件名。argv数组必须以NULL指针结尾。(因此,在新程序中,argv[argc]将为NULL)。envp是传递给新程序环境变量的字符串指针数组。

pursuit的博客 4171

Linux进程管理 | 替换进程映像exec系列函数

替换进程映像 exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。exec函数可以把当前进程替换为一个新进程,新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序。例如,可以在启动另一个有着受限使用策略的程序前,检查用户的凭证。exec函数比system函数更有效,因为在新的进程启动后,原来的程序就不再运行了。 #in...

ZY-JIMMY 1414

execve函数

虚拟存储器和存储器映射在程序加载到存储器的过程中扮演很关键的角色。execve函数在实际中如何加载和执行程序的呢?就是用到上边两个关键的概念。 exec簇函数,最后,都是调用了execve这个函数! 这个函数的作用,就是去执行一个文件! 典型的用法,就是在shell中,执行一个文件,比如说,一个编译好的文件,叫做helloworld,那么,在shell下执行./helloworld的时候,s...

苞米地里捉小鸡的博客 2247

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2367

深入理解execve函数

filename:指定新程序的路径和名称。argv:传递给新程序的命令行参数数组。envp:传递给新程序的环境变量数组。

m0_72410588的博客 2921

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1682

【Linux系统】exec系列函数详细介绍

详细介绍exec系列函数的用法,每个函数的后缀 "l、e、p、v" 的意思和作用、一个进程的环境变量来源

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 2176

Android架构中UseCase的设计原则与实战解析

本文深入解析Android架构中UseCase的设计原则与实战应用,探讨其在Domain Layer中的核心作用。通过对比ViewModel的臃肿问题,详细阐述UseCase的无状态原则、单一职责边界等设计铁律,并提供多种实现方式的代码示例,帮助开发者构建更清晰、高效的Android应用架构。

weixin_28432777的博客 431

NFS共享速度慢?麒麟系统性能调优5个关键参数实测对比

本文针对银河麒麟服务器系统上NFS共享速度慢的问题,通过实测对比分析了五个关键调优参数。重点探讨了rsize/wsize传输块大小、TCP/UDP协议选择、sync/async模式权衡等,并结合麒麟系统特性提供了具体的优化建议与配置示例,旨在帮助用户有效提升国产化环境下的文件共享性能。

weixin_29254029的博客 337

Linux下exec系列函数的使用

Linux系统中,我们可以使用可以使用system函数和exec系列的函数调用另一个可执行文件或调用命令。 exec系列函数简单介绍 #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL

年年年的博客 2839

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 419

【Linux】exec 系列函数与 system

本文总结了 exec 系列函数与 system 的区别,分别介绍了每个 exec 函数的用法、特点及实际应用场景,适合入门学习或查阅参考。

weixin_56167571的博客 1337

UltraScale系列底层结构(3)——URAM概述

在UltraScale+™ 器件中,除了我们在常规熟悉的BRAM资源以外,还额外提供了URAM(UltraRAM)资源。 UltraRAM 是一种单时钟同步操作的高密度存储器,每个 UltraRAM 块可存储 288 Kb 数据,配置为 4K x 72 位的存储单元,其容量是 Block RAM 的八倍。虽然 UltraRAM 内部使用单端口存储单元,但通过在一个时钟周期内顺序执行端口 A 和端口 B 的操作,实现了双端口功能。

apple_53311083的博客 2835

软件设计师---计算机系统

软件设计师---计算机系统

我从不打没有准备的仗! 3万+

exec系列函数使用总结

exec系列函数使用总结

2401_85199775的博客 512

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言— exec系列函数

exec系列函数的行为大体相同,区别在于传递参数的方式和是否使用环境变量。不返回:如果调用成功,这些函数不会返回,而是用新程序替换当前进程映像。如果失败,它们会返回 -1,并设置errno以指示错误类型。参数传递:这些函数允许将参数列表传递给新程序,通常包括程序路径和命令行参数。execve是exec系列函数中最底层的一个,它提供了最大的灵活性,因为它允许直接指定程序路径、参数列表和环境变量。pathname:要执行的程序文件的路径。argv:传递给新程序的参数列表,其中argv[0]

weixin_45706195的博客 1233

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

从理论到实践:Linux 进程替换与 exec 系列函数

Linux 进程替换通过 exec 系列函数实现,允许当前进程被新的程序替换,清空进程的用户态资源并加载新程序。该过程保留进程的内核态资源,如 PID 和文件描述符。常见的 exec 系列函数包括 execl、execp、execv 等,用于加载新程序并传递命令行参数。

A.的博客 3704

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

进程替换exec系列函数

进程替换,不是创建一个新进程,而是并且,进程替换是与进程复制配合进行的。在进程复制时,我们根据fork()的返回值对父子进程进行区分,使其进行不同操作。在使用进程替换后,我们就可以使新进程更加直接的执行我们想要做的操作。进程复制时,父子进程代码相同,父子进程要进行的操作在同一份代码中,根据逻辑判断才进行区分。对于父进程来说,子进程要执行操作的代码就是冗余的。使用进程替换,我们就可以将想要执行的新操作封装在一个新程序中,在原进程中只用调用进程替换函数,替换为新进程执行就可以了。

weixin_50803498的博客 572

linux代码实操:exec系列函数进程实验

, 接着调用exec系列函数(实验中使用execl()函数), 这个函数在/bin/ls目录中搜索程序ls,然后它将会替换exec_demo本身的进程, 程序运行结果与在终端中使用以下所示的shell命令一样,如下图。前面我有一篇文章介绍到了使用fork()函数启动一个子进程,事实上,这是并没有太大作用的,因为子进程跟父进程都是一样的, 子进程能干的活父进程也一样能干,因此世界各地的开发者就想方设法让子进程做不一样的事情, 于是诞生了。, 在执行完之后,原调用进程的内容除了进程号外,其他全部。

weixin_64685646的博客 2263

进程替换,exec系列函数使用

进程替换,exec系列函数使用进程替换就是指进程不变(进程的pcb,进程地址空间不变),仅仅替换当前进程的代码和数据的技术(新程序的替换旧进程的),叫做进程的程序替换,这样就好像子进程执行了一个全新的程序。

songwenbiao的博客 148

Linux——进程替换exec、exec系列函数、习题演示

/在环境变量PATH 指定的路径里面搜索;//把参数都放在了一个 数组中//系统调用。

x20020402的博客 605

程序替换----exec系列函数

使用execl等exec系列函数执行其他程序后,原程序中exec调用之后的代码(eg:和return 0))不会执行。无论替换为lstop等任何程序,均表现为:只执行被替换程序,原进程后续代码被完全跳过。exec系列函数用于在当前进程中替换程序(加载新程序执行),核心功能相同,差异主要体现在参数传递方式和程序查找方式。execlexeclpexecleexecvexecvpexecvpeexecve(其他库函数均基于execve实现)

2403_82706967的博客 1082
上一篇: fork, wait, system
下一篇: %s 与 %ls的区别
ALENTAM
博客等级 码龄21年 17粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值