首页app软件【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数

【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数

圆圆2025-06-21 17:00:27次浏览条评论

推荐书籍:

《深入理解计算机系统》《程序员的自我修养》

1.理解子进程调用去替换函数,达到我们想要的目的。shell命令行也是这样进行处理,我们每次操作的命令,都是fork()创建子进程,然后子进程调用exe函数进行替换,去执行我们想要的程序。比如ls……这些都是一些执行程序对应。

2 .进程替换没有创建新进程,所以调用替换函数的进程pid不会发生变化。

3.程序替换函数只要成功,就会发生代码替换,不会返回值。如果有返回值,就表示程序替换失败。替换原理:

当一个程序调用exe类型的函数时,这个进程的用户空间代码和数据完全被新进程替换。

从新程序的启动进程开始执行。 从mian函数开始执行)

exe程序替换函数一般是调用子进程进行。

调用exe类型的函数不会创建新进程,调用exe函数的进程pid不会改变。

​替换函数:

程序替换函数以exe开头,所以系统称为exe函数。命名理解:

●l(li st):表示参数采用链表。

●v(vector):采用数据库。

●p(PATH):有p表示自动搜索环境变量PATH。

●e(env):表示自己维护环境变量。命令:

在/usr/bin中放置的就是命令的执行文件。

​6个exe函数 1.execl函数函数原型:函数解释:

1.三个点表示变量参数列表,可以传多个参数。

2.path表示要替换程序的路径。(在哪里)

3.后面的arg表示什么样的命令执行。(怎么退出now直播账号)执行)实例:

--color表示带颜色显式,这里有两个-。

也可以执行自己的路径,执行自己的执行程序。

​代码语言:javascript代码运行次数:0运行复制#include lt;unistd.hgt;#include lt;iostreamgt; int main(){ int a=execl(quot;/usr/bin/lsquot;,quot;lsquot;,quot;-lquot;,quot;-aquot;,quot;--colorquot;,nullptr); //如果打印了a的值就表示替换失败 std::coutlt;lt;alt;lt;std::endl; return 0;}登录后复制2.execv函数函数原型:函数解释:

1.把这个和1号函数进行比较,唯一的区别就是后面不一样:

execv传入的是一个char* const的数组,而execl传入的是一个const char*。

v像vector,表示吞吐量。l像list表示的链表,链表就是分别传参。

2.这两个函数没有本质区别,底层都是调用execve。

他们就只有传递参的不一样,execl调用execve后,传递的每个const char*会变成一个char*数据库。

3.后面的几个函数都只有参数不同,底层都调用execve。设计这么多函数是为了满足不同场景的需求,有时候就是要一个一个传参,有时候需要一个char*数据库。示例:

​3.execlp和execvp函数原型:

这两个函数都是带p的,就不要写路径。

代码语言:javascript代码运行次数:0运行复制 #include lt;unistd.hgt; #include lt;iostreamgt; int main() { //int a=execl(quot;/usr/bin/lsquot;,quot;lsquot;,quot;-lquot;,quot;-aquot;,quot;--colorquot;,nullptr); //int a=execl(quot;./myprocessquot;,quot;./myprocessquot;,nullptr); pid_t id=fork(); if(id==0) { char* const argv[]={ (char*)quot;lsquot;, (char*)quot;-lquot;, (char*)quot;-aquot;, (char*)quot;--colorquot;, nullptr }; //int a=execv(quot;/bin/lsquot;,argvs); // int a=execlp(quot;lsquot;,quot;lsquot;,quot;-lquot;,quot;-aquot;,quot;--colorquot;,nullptr); int a=execvp(quot;lsquot;,argv); // 如果打印了a的值就表示替换失败 std::coutlt;lt;alt;lt;std::endl; exit(1); } pid_t pid=waitpid(id,nullptr,0); if(pidgt;0) { std::coutlt;lt;quot;等待进程成功!quot;lt;lt;std::endl; } else if(pidlt;0) { std::coutlt;lt;quot;等待进程失败!quot;lt;lt;std::endl; } return 0;}登录后复制4.execle和execve函数:

有e是要进行自己进行环境变量的。execvpe函数:函数原型:函数解释:

1.env是我们提交的全新的环境变量。对于env我们可以提交父进程的环境变量,也可以在父进程的环境变量上新增。

2.刚刚开始的进程bash就要提交自己写的环境变量。自己写的环境变量,自己定义,提交自己。

3.如何新增环境变量:总结:

实际上,只有execve才是真正的系统调用,其他的函数都是调用execve。所以execve在man的手册2,​​其他函数在手册3。

以上就是【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数的详细内容,更多请乐常识网其他相关文章!

【Linux课程学习
potplayer怎么翻译字幕 potplayer怎么设置播放音乐
相关内容
发表评论

游客 回复需填写必要信息