【Linux】进程控制(四):进程程序替换 exec 函数簇

本文详细介绍了Linux进程控制中的进程程序替换,包括概念、原理和为什么要进行替换。重点讲解了execl、execlp、execle、execv、execvp和execve等exec函数簇的用法和区别,通过实例展示了如何使用这些函数进行进程程序替换。
摘要由CSDN通过智能技术生成

【Linux】进程控制(四):进程程序替换 exec 函数簇


一、进程程序替换

1.1 概念

  用 fork 创建子进程后执行的是和父进程相同的程序,此时子进程就需要进程程序替换,进程程序替换就是将已经跑起来的进程替换成执行其它程序的进程,也就是说该进程的用户空间代码和数据完全被新程序替换,子进程从新程序的启动历程开始执行。


1.2 原理

image-20210708173726222

  替换函数将正在执行的进程的进程虚拟地址空间里的代码段和数据段替换成新的程序,当前在执行的进程就会执行替换之后的程序代码,并且堆区和栈区都需要更新。


1.3 为什么要进程程序替换

  守护进程先启动,创建一个子进程,让子进程程序替换成为另一个程序,实现不同的一个功能,父子进程会进行通信,实现 “当子进程异常退出时,守护进程就会重新拉起子进程”。(但不能说守护进程一定能够解决子进程异常退出的问题,异常退出可能是子进程的程序代码存在一定的问题)

  我们常用的 shell 命令行解释器,就是采用的进程程序替换的原理。


二、进程替换接口

  exce 函数簇: 它不是一个函数,而是一堆函数。(execl 、execlp、execle、execv、execvp、execve)

#include <unistd.h> 

int execl(const char *path, const char *arg, ...); //库函数
int execlp(const char *file, const char *arg, ...); //库函数
int execle(const char *path, const char *arg, ..., char * const envp[]); //库函数

int execv(const char *path, char *const argv[]); //库函数
int execvp(const char *file, char *const argv[]); //库函数
int execve(const char *file, char *const argv[],char *const envp[]);   //系统调用

2.1 execl 函数

#include <unistd.h>
//库函数
int execl(const char *path, const char *arg, ...); 

参数:

  path: 带路径的可执行程序,即替换的可执行程序的路径和名称

  arg: 给可执行程序传递的参数(传递的第一个参数必须是可执行程序的名称,后面依次传递,中间以 “逗号” 隔开,最后以 “NULL” 结束)

返回值:

  替换成功,没有返回值;替换失败,返回小于 0 的值,仍旧执行当前的程序代码。

验证:

  shift 程序替换 execl 程序

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值