🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于知识分享,与更多的人进行学习交流
execl
函数用于执行一个新的程序,为一个进程的0-3G用户空间进行重载。执行一个指定的可执行文件,来替代当前进程,也就是说,它会加载一个新的程序映像并运行它,取代当前进程。
函数原型
#include <unistd.h>
int execl(const char *path, const char *arg0, const char *arg1, ..., const char *argn, (char *) NULL);
参数说明
path
:指定要执行的可执行文件的路径,可通过pwd命令查看
arg0, arg1, ..., argn
:命令行参数列表,以NULL结尾。第一个参数arg0
通常是执行的程序的名称(例如:拷贝命令,就是cp),后面是参数列表(要拷贝的源文件和目标)。
(char *) NULL
:用于标记参数列表的结束,必须是NULL
。
注意事项
execl
函数在执行成功后,不会返回,它会将当前进程替换为新的程序。如果它返回,通常表示发生了错误。如果我们需要让子进程执行一些自定义代码和任务,一定要在fork
之后,execl
之前完成如果
execl
执行失败,它将返回-1
并设置errno
,可以使用perror
或者errno
来查看错误信息。
execl
函数执行的流程
在子进程被fork之后,先不映射父进程的内存空间,等待其它进程重载。
如果在重载之前,子进程的代码段还有其它的代码语句,那么只有execl
调用之前的代码可以成功执行,调用之后,代码被复写了,无法继续向下执行,而是替换为重载的进程。
当调用execl
后,execl
会预启动浏览器,浏览器的用户层数据将替换和覆写到子进程的用户空间, 取代了子进程当前用户空间,我们也就可以通过子进程来执行打开浏览器的操作了。
下面是完成这一操作的demo程序:
首先我们需要查看启动Firefox的命令在哪个目录下
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/fcntl.h>
int main()
{
pid_t pid;
pid=fork();
if(pid>0){
printf("Parent Process PID:%d\n",pid);
}
else if(pid==0){
printf("Child Process PID:%d\n",pid);
execl("/usr/bin/firefox","firefox","www.bilibili.com",NULL);
printf("hello\n");
exit(0);
}else{
perror("fork call failed");
}
return 0;
}
可以看到,当我们最后一个参数没有传入NULL时,编译不会通过
运行程序,我们可以看到,火狐浏览器自动打开,并且显示出了对应的网页。
而且execl
函数之后的代码printf("hello\n")
并没有执行,所以execl
调用之后,子进程的用户空间被重载了。
这样我们的demo程序就完成了。