【Linux】execl函数详解|进程重载

🔥博客主页: 我要成为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程序就完成了。

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值