exec族函数

C++ 调用exe,可等待调用的exe执行完毕后才继续执行父进程 CreateProcess #include   STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( 阅读详情

为什么需要exec函数?

  • fork子进程是为了执行新程序(fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行)
  • 可以直接在子进程的if中写入新程序打代码。但这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制)。例如我们希望子进程来执行ls -la命令就不行了(没有源代码,只有编译好打可执行程序)。
  • 使用exec族函数运行新的可执行程序。exec族函数可以直接把一个编译好的可执行程序直接加载运行。
  • 有了exec族函数后,典型打父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。主进程为父进程,fork创建了子进程后在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。

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 */);
int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

(1)execl和execv

int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */)
int execv(const char *path, char *const argv[]);

这两个函数是最基本的exec,都可以用来执行一个程序,区别是传参的格式不同。execl是把参数列表(本质上是多个字符串,必须以NULL结尾)依次排列而成(l其实就是list的缩写),execv是把参数列表事先放入一个字符串数组中,再把这个字符串数组传给execv函数。

(2)execlp和execvp

int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);
int execvp(const char *file, char *const argv[]);

这个两个函数在上面两个函数打基础上加了p,较上面2个来说,区别是:上面两个函数执行程序时必须指定可执行程序打全路径(如果exec没有找到path这个文件,则直接报错),而加了p的传递打可以是file,也可以是path。加了p的这两个函数会首先会去环境变量PATH所指定的目录下去找,如果找到则执行,如果没有找到则会去当前目录下找file,如果找到则执行,如果没有找到则报错。

(3)execle和execvpe

int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, char * const envp[] */);
int execvpe(const char *file, char *const argv[],char *const envp[]);

这两个函数较基本exec来说是加了e,函数的参数列表中也多了一个字符串数组envp形参,e是environment环境变量的意思,和基本版本的exec的区别就是:执行可执行程序时会多传一个环境变量打字符串数组给待执行打程序。

实例

(1)使用execl运行ls -la

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

int main(void)
{
    pid_t pid;
    if((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    else if(pid == 0)
    {
        /* child */
        execl("/bin/ls", "ls", "-l", "-a",NULL);
    }
    else
    {
        printf("parent, child id = %d.\n",pid);
    }
    return 0;
}

这里写图片描述
注意execl("/bin/ls", "ls", "-l", "-a",NULL);
传的参数arg是从第二个字符串开始看的(从”-l”开始),但是如果没有”ls”会出现警告。把”ls”改成”pwd”,结果不会变,说明执行的可执行程序还是”/bin/ls”。”ls”相当于argv[0],是我们执行程序的程序名。

(2)使用execv运行ls -la

在(1)打代码基础上做些许改动即可。

    else if(pid == 0)
    {
        /* child */
        //execl("/bin/ls", "ls", "-l", "-a",NULL);
        char* const argv[] = {"ls", "-l", "-a", NULL};
        execv("/bin/ls", argv);
    }

(3)使用execl运行自己写的程序hello

这里写图片描述
在(1)打代码里做些许改动。

    else if(pid == 0)
    {
        /* child */
        execl("./hello", "hello",NULL);
    }

这里写图片描述

(4)execle的使用
main函数的原型其实不只是int main(int argc, char *argv[]),也可以有int main(int argc, char *argv[], char *env[])。
第三个参数是一个字符串数组,内容是环境变量。
如果用户在执行程序时没有传递第三个参数,则程序会自动从父进程继承一份环境变量(默认打,最早来源与OS中打环境变量); 如果我们exec时使用的是execlp或者execvpe去传一个envp数组,则程序中的实际环境变量是我们传递的这一份(取代了默认的从父进程继承来的那一份环境变量)。
hello.c

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *env[])
{
    int i;
    printf("argc = %d\n", argc);
    i = 0;
    while(NULL != argv[i])
    {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
    }
    i = 0;
    while(NULL != env[i])
    {
        printf("env[%d] = %s\n", i, env[i]);
        i++;
    }
    return 0;
}

exec_2016-10-13.c

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

int main(void)
{
    pid_t pid;
    if((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    else if(pid == 0)
    {
        /* child */
        execl("./hello", "hello", "-l", "-a", NULL);
    }
    else
    {
        printf("parent, child id = %d.\n",pid);
    }
    return 0;
}

从父进程继承来的环境变量。
这里写图片描述

使用execle。修改后的exec_2016-10-13.c。

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

int main(void)
{
    pid_t pid;
    if((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    else if(pid == 0)
    {
        /* child */
        char* const envp[] = {"AA=aaa", "XX=abcd", NULL};
        execle("./hello", "hello", "-l", "-a", NULL, envp);
    }
    else
    {
        printf("parent, child id = %d.\n",pid);
    }
    return 0;
}

取代后。
这里写图片描述

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区)) 程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的 阅读详情

相关推荐

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8173

c中execl命令了解

在这个例子中,/bin/ls是要执行的可执行文件路径,ls是新进程的argv[0]参数,-l和/tmp分别是传递给ls命令的两个参数,(char *)0表示参数列表的结束。const char *arg0:这是新进程的argv[0]参数,通常用来传递可执行文件的名称。在一般情况下,这个参数应该与path参数相同,即可执行文件的名称。:这表示可变数量的参数列表,用来传递给新程序的命令行参数。在execl函数中,你可以在arg0后面列出多个参数,这些参数会被传递给新程序。

世上哪有什么岁月静好,不过是有人替你负重前行 1791

219页华为供应链管理:市场预测S&OP计划、销售预测与存货管理精要

S&OP计划的整合作用:S&OP是一种综合的销售和运营计划流程,它将市场预测、生产能力、库存水平和财务目标整合在一起,以确保企业能够平衡供需,实现最佳的运营效率。持续监控与改进:市场预测、S&OP计划、计划委员会的决策以及存货管理都需要持续的监控和评估。供应链策略与执行:华为ISC拥有清晰的供应链策略,并通过SISC架构实现了策略的有效执行,包括供应链网络设计、库存管理、物流优化等。持续的供应链创新:华为ISC不断探索新的供应链管理方法和技术,如数字化供应链、智能物流等,以适应全球化和市场的快速变化。

zuoan1993的博客 2433

C语言 execl

int execl(const char *path, const char *arg, ...);//执行其他程序 int execlp(const char *file, const char *arg, ...);//执行其他程序,使用PATH环境变量,可以不加文件路径 file 要执行的程序 arg 参数列表 参数列表需要NULL作为结尾 返回值 只有失败才返回 调用一种exec函数时,...

Claroja 2634

RDMA网络通信技术、NCCL集合通讯(GPU)

NCCL 是 NVIDIA 专为 GPU 设计的高性能集合通信库,用于优化多 GPU、多节点间的集体操作(如 AllReduce、Broadcast、AllGather 等),是深度学习分布式训练的核心组件。RDMA 允许计算机直接访问远程内存,无需 CPU 干预,大幅降低了网络通信的延迟和 CPU 开销。常见的 RDMA 实现包括。是两项关键技术,用于优化节点间数据传输效率和大规模并行计算性能。在高性能计算(HPC)、人工智能训练和数据密集型场景中,

weixin_42795092的博客 2422

Unity Shader学习笔记/Urp/水墨风效果

Unity Shader学习

qq_63133691的博客 2117

C语言execl函数

#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <sys/types.h> #include <string.h> int main(int argc, char *argv[]) { // execl函数 // int execl(const char *pathname, const char *arg, ... // p

ma_de_hao_mei_le的博客 3450

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 296

嵌入式C语言的小细节,excel的几个函数

记录一下笔记 嵌入式C语言有时候无法使用Static关键字 嵌入式C语言中如果定义了变量没有使用可能报错 嵌入式C语言中如果定义了无符号类型的变量最好别去和0比较,可能会报错 嵌入式C语言的技巧if,else的嵌套使用得好可以加快速度 excel的使用=‘sheet’!A1 跨表传递数据很有用 excel的使用中,=count(obj1:obj2)是一个很厉害的函数,作用是统计obj1到obj2的数字的个数; ...

hpx12345678的博客 963

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1106

【SpringBoot 4.x 第2节】夯爆了,学习 Spring Boot 4.x 前,需要具备哪些 Java 基础?

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 4567

unix中的exec族函数介绍

介绍unxi系统的exec类函数

weixin_48344581的博客 2529

汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测

本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1330

Linux进程——exec族函数、exec族函数与fork函数的配合

然后再调用execl,用execl 找到并执行echoarg,将当前进程main替换成进程echoarg,就会执行ehcoarg里面的代码,所以”after execl” 没有在终端被打印出来。不会执行if中的代码。可见echoarg存在于当前路径并不存在于bin路径下,所以调用execl函数无法找到echoarg并执行echoarg,调用失败返回值为-1,则会继续执行if函数里的代码。定义一个指针数组并将其地址作为execvp函数后面的参数,同时要以NULL结尾,便可以找到并执行ls可执行文件。

2301_78772787的博客 2460

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux进程——exec族函数

linux

haha474的博客 3127

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

进程入门之exec族函数

昨天把虚拟机玩坏了,没办法,安装了一个新的18.04的Ubuntu,稍微美化了一下,重新安装了VMware Tools,感觉我的虚拟机完全成了Mac(虽说Mac的底层操作系统的确是根据Linux改的,所以性质差别不大),总之因祸得福,很满意!简单给你们来个截图康康[doge] 有点小帅吧,嘻嘻。Terminal感觉以前用的12.04的好看和好用,进入今天的正题! exec族函数: 1.首先exec族有6个:execl、execlp、execle、execv、execvp、execvpe 2.我们用fork

ChrisKevin0221的博客 576

exec族函数、system函数、popen函数、PATH

exec族函数函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序(在exec都后面的代码不会被得到执行)。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。 exec族函数功能: 在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。 函数族: exec函数族分别是:execl, execlp, execle, execv, execvp, e

FHN优快云 671

linux:exec族函数, exec族函数配合fork使用,system 函数,popen 函数

1、exec族函数 精彩博文: https://blog.youkuaiyun.com/u014530704/article/details/73848573 ​ ​ ​ path: 比如说 ./a.out arg: 比如以前的cp demo11.c demo12.c 首先在系统中编译很多的可执行程序 ​ 我希望呢,11运行到一半的时候 或者 发生某些情况的时候 11会去调用12,让12去运行 ​ ./bin/echoarg :路径名 第一个参数程序名:...

m0_57089315的博客 435

Linux系统编程之进程(exec族函数)

功能:在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。函数族:exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe函数原型:SYNOPSIS返回值:exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。参数说明:path:可执行文件的路径名字。

咖喱年糕的博客 2312

exec族函数总结

1> execve为系统调用  其他的都是封装的函数 l:参数列表   p:在环境变量PATH中寻找   v:参数数组   e:替换环境变量列表 返回值:函数出错 返回0   否则不反回(原来的用户区已经被替换  只留下PCB所以没有返回的地方) exec族函数只替换用户区  但是对内核区的PCB也有一定的影响(详见 apue3 p201页) 2> 对文件描述符的影响     若打开文件

u013378057的专栏 552

linux进程之exec族函数

文章目录exec族相关APIexeclexeclpexecvexecvpsystem函数popen函数 当们想在某一个进程中,要打开另一个程序时,可以调用该族函数,当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。 exec族相关API #include <unistd.h> extern char **environ; int execl(const char *path,

m0_49507996的博客 288

Linux系统编程——exec族函数

exec一般情况用不到,仅当你要给新程序指定新的环境变量时才用。exec系列函数是“把自己变成另一个程序”的魔法。不创建新进程,而是“换皮重生”;常用execlp()和execvp();一定配合fork()使用,否则你原来的程序会消失。

weixin_45720999的博客 1254

Linux-exec族函数

1、为什么需要exec族函数 (1)、fork子进程是为了执行新程序(fork创建子进程后,子进程和父进程同时被OS调度执行,因此子程序可以单独的执行一个程序,这样程序宏观上将会和父进程程序同时进行) (2)、可以直接在子进程中的if中写入新程序的代码。这样做是可以的,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码如果太长了也不好控制),譬如说我们希望子进...

weixin_30562507的博客 121

exec族库函数的学习

文章目录main函数要传的参数代码就像这样子进入正题,exec族函数execl和execv代码注意总结 main函数要传的参数 通过这节课的学习才知道,其实main函数不仅可以穿argc和argv,还有一个环境参数env可以传进去。 代码就像这样子 #include <stdio.h> int main (int argc, char *argv[],char *env[])// ...

fsczp的博客 405

P11 Linux进程编程exec族函数

l : 使用参数列表p:使用文件名,并从PATH环境进行寻找可执行文件v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量。

weixin_73901182的博客 1159
上一篇: 文件系统---stat函数
下一篇: 守护进程
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值