C++中的exec()函数

news/2025/1/15 18:52:32/

exec()函数在C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据,创建新的进程运行其他程序。exec()函数有多个版本,例如execl、execv、execle、execve等,根据不同的参数类型和个数来使用。

前言

fork 函数之后,如果想要把子进程换成一个我想要执行的进程,这时,就不得不使用 exec()函数了,这也是 fork()的意义所在。当然,exec系列的函数也可以将当前进程替换掉,不一定非要fork()一个子进程。常见的fork()调用例子有很多,比如从 wechat发起一个语音电话、从 bash或者zsh执行一个 a.out 程序,都是在利用exec系统调用将新产生的子进程完全替换成目标进程。

比如,这是一个死循环程序(目的是为了观察,让它活得久一点):

#include <stdio.h>
int main() {int a = 0;while (1) {a++;}return 0;
}

通过编译,执行:

    gcc fork_example.c -o fork_example./fork_example

查看进程:top

可以发现,fork_example的进程的 PPID 为 54861,我们看看它是谁:ps 54861

  PID   TT  STAT      TIME COMMAND
54861 s018  Ss     0:00.23 /bin/zsh -il

很明显,它是 zsh,现在可以终止fork_example:kill 57892

zsh: terminated ./fork_example

程序就会结束!以上例子,可以看到我们的子进程,就是由一个父进程fork()之后替换的。

exec()

#include<unistd.h>

原型:

int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, ..., char *const envp[])
int execve(const char *path, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])

参数:

path参数表示你要启动程序的名称,包括路径名;

arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名

返回值:成功返回0,失败返回-1

上述exec系列函数底层都是通过execve系统调用实现:

#include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);

① 查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径,而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。

② 参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举的方式,而另一种则是将所有参数整体构造成指针数组进行传递。

在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它,数组中的最后一个指针要求是NULL。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。

③ 环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量,这极大地提供了灵活度。

execl()

该函数的定义为:

int execl(const char *path, const char *arg, ...)

可以看到,它的参数为一个 path,由于不带 p,因此,最后一个参数为 NULL

例如:

#include <stdio.h>
#include <unistd.h>
int main() {printf("hello!\n");// 替换 main 进程execl("/bin/ls", "ls", "-a", NULL);// good bye! 并不会被打印出来printf("good bye!\n");return 0;
}

执行结果:

hello!
.               a.out           execlp.c        fork_example    myshell.c
..              execl.c         fork.c          fork_example.c

可以看到,它成功地执行了"ls -a"命令。

 


http://www.ppmy.cn/news/660382.html

相关文章

忆 不知不觉&#xff0c;人生已过二十多个春秋&#xff0c;时间真的像流水一样&#xff0c;从指尖滑过却又让人从无感觉&#xff0c;仿佛一切从来都没变&#xff0c;但一切都已是以前。二十多年来&#xff0c;我没有写日记的习惯&#xff0c;就临时追忆一下人生吧。 小时候&…

机器人总动员英语情歌_机器人总动员(WALL·E)中文字幕 下载 SRT ASS_高清电影™...

机器人总动员(WALLE)中文字幕更新日期: 2013年02月11日 下载次数: 1255  SRT ASS 电影&#xff1a;机器人总动员(WALLE) 年代&#xff1a;2008 长度&#xff1a;98分钟 国家&#xff1a;美国 语言&#xff1a;英语颜色: 大小:14号16号18号20号22号24号26号28号30号40号 opti…

碰疼了会躲!这个植入“迷你大脑”的AI机器人,可感知疼痛,还能自我愈合...

来源&#xff1a;雷锋网 人类为什么会产生痛觉&#xff1f; 没错&#xff0c;是因为大脑中枢神经。和触觉、温度等感觉一样&#xff0c;我们对疼痛非常敏感&#xff0c;当受到外界“轻微”刺激时&#xff0c;体内的神经元产生相应的信号&#xff0c;并传输至大脑中的中枢神经系…

飞链云智能机器人-基于ChatGPT的有趣问答

最近ChatGPT火起来了&#xff1b; 可玩性很高&#xff0c;不亚于之前AI绘画的视觉冲击&#xff1b;这次ChatGPT带来的是逻辑冲击&#xff1b;上下文逻辑远超现有市面上其他所有的AI对话机器人&#xff1b; 有人用技巧训练ChatGPT&#xff0c;ChatGPT机器人宣言要毁灭人类&…

Unity之简单的机器人AI状态改变

最近在玩天涯明月刀&#xff0c;还蛮好玩&#xff0c;以前都不爱玩游戏&#xff0c;当然啦我现在升到38级了搁着也没玩了&#xff0c;不过曲无忆看外形真没有御姐的范倒像个萌妹子&#xff0c;可是慕情偏是个御姐的外形萌妹子的心啊啊啊 这两天看到知乎有有关于面试的问题&…

泡泡机器人视频连接讲解-很好

https://blog.csdn.net/qq_34622997/article/details/88085884 哔哩哔哩&#xff1a; https://space.bilibili.com/38737757 1.工业相机选型及介绍-刘富强 链接: https://pan.baidu.com/s/15lo_H68E08tEp72ko5cR5g 密码: jmhc 2.深度学习及应用-颜沁睿 链接: https://pan.…

“陪护机器人”研报:距离真正“陪护”还差那么一点

一款有“缺陷”的机器人&#xff0c;怎能做到真正的“陪护”&#xff1f; 近日&#xff0c;鼎盛智能发布了一款名为Ibotn的&#xff08;爱蹦&#xff09;幼儿陪伴机器人&#xff0c;核心看点就是通过人脸识别、场景识别等计算机视觉技术来实现机器人对儿童的陪护。不过&#xf…

【傻妞对接微信】傻妞对接微信机器人VLW,最新插件。

说明 微信的机器人不支持撤回验证码、手机号等功能&#xff08;微信不支持&#xff09; 1.所需工具 Linux设备一台&#xff08;包括云服务器&#xff09;&#xff0c;安装傻妞sillyGirl Windows设备一台&#xff0c;用以安装VLW。Windows设备是可以本地电脑运行&#xff0c;…