当我们fork()生成子进程后,子进程的代码与数据可以来自其他可执行程序。把磁盘上其他程序的数据以覆盖的形式给子进程。这样子进程就可以执行全新的程序了,这种现象称为程序替换。

文章目录

  • 1.进程替换注意事项
  • 2.替换函数(unistd.h)
  • execl
  • execlp
  • execv
  • execle
  • 替换函数的命名理解(execvp,execve)
  • 3.替换函数总结

1.进程替换注意事项

1.进程替换不会创建新进程,因为进程替换只是将该进程的数据替换为指定的可执行程序。而进程PCB没有改变,所以不是新的进程,进程替换后不会发生进程pid改变。

2.进程替换后,如果替换成功后则替换函数下的代码不会执行,因为进程替换是覆盖式的替换,替换成功后进程原来的代码就消失了。同理在进程替换失败后会执行替换函数后的代码

3.进程替换函数在进程替换成功后不返回,函数的返回值表示替换失败

4.进程替换成功后,退出码为替换后的进程的退出码

2.替换函数(unistd.h)

execl

函数原型
int execl(const char *path,const char *arg,…)

参数解释
path为可执行程序的路径,arg为如何执行这个可执行程序
…为可变参数,指的是给这执行程序携带的参数,在参数末尾加NULL表示参数结束

返回值:替换失败返回-1,替换成功不返回

eg:


观察上图发现进程替换成功后,替换函数下的打印没有执行,原因与注意事项的第二条相同

如果替换失败:

execlp

函数原型:
int execlp(const char *file, const char *arg,…)
参数解释:
file:要替换的目标程序,arg:如何执行这个程序,…为给这个程序传的参数。最后以NULL结束表示传参结束

返回值:进程替换失败后返回-1。

相比于execl :execp默认在Linux环境变量PATH中查找可执行程序

Linux环境变量

eg:

execv

函数原型:
int execv(const char* path,char* const argv[ ]);

参数解释:
argv数组:保存的是参数列表,将如何执行 可执行程序 和可执行程序需要的参数保存到字符串数组中,最后以NULL结尾表示参数结束,给execv
path:替换目标程序路径,

返回值:进程替换失败返回-1

eg:



可以发现argv数组与main函数的命令行参数相同
Linux_main函数命令行参数

execle

函数原型:
int execle(const char* path, const char* arg, …,char* const envp[ ])
参数解释:
path为替换的目标程序路径,arg与…表示如何执行替换后的程序以NULL结尾。
envp数组为要导入的环境变量
返回值:
替换失败返回-1
eg:

因为此时我们没有环境变量MYSTR所以第一行打印为空

这里在myProc子进程中用execle函数来导入环境变量MYSTR

注意:
1.导环境变量的数组最后以NULL结尾
2.导入环境变量后原系统环境变量的值被清空,这种导入环境变量的方式为覆盖式导入

替换函数的命名理解(execvp,execve)

替换函数前面的exec不变
l:参数采用列表
v:参数采用数组
p:不需要输入路径,在环境变量自动搜索
e:要导入自己的环境变量

所以execvp表示不需要输入路径,参数用数组传
execve表示需要输入路径,参数用数组传,自己维护环境变量

execvp拓展_简易shell

我们在命令行输入的命令可以用函数fgets来获取
定义一个字符数组
char Shell[100]
fgets(Shell,100,stdin);这样就可以将我们的命令存起来。
因为不同参数之间用空格相隔,所以我们可以用字符串分割函数strtok来分割处理成字符串存到数组中。
strtok函数在没有找到或者最后一次找到时返回NULL,这个函数可以将字符串分割为多个字符串。
execvp:不需要路径,参数用数组传,而strtok分割的正好为命令的参数,我们输入的命令又在环境变量中
所以我们利用进程替换可以实现简易的shell
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>#define MAXLEN 1024
#define LEN 32int main()
{char shell[MAXLEN]={0};char* DOS[LEN]={0};//保存处理后的参数while(1){printf("[dodamce@My_centos dir] ");fgets(shell,MAXLEN,stdin);shell[strlen(shell)-1]='\0';DOS[0]=strtok(shell," ");int i=1;while(DOS[i]=strtok(NULL," "))//strtok按照空格拆分字符串,并且将其存到DOS字符串数组中{i++;}pid_t id=fork();//创建子进程if(id==0){//childexecvp(DOS[0],DOS);//不需要路径,DOS第一个元素就是我们要替换的可执行程序exit(1);}int status=0;//父进程阻塞等待,接受并打印子进程的退出码,防止僵尸进程pid_t wait=waitpid(id,&status,0);if(wait>0){printf("Exit Code=%d\n",WEXITSTATUS(status));}}return 0;
}

3.替换函数总结

函数名 参数传递形式 路径 是否导入环境变量
execl 列表 需要可执行程序路径 不导入 使用当前环境变量
execlp 列表 默认在环境变量中找 不导入 使用当前环境变量
execle 列表 需要可执行程序路径 导入 使用导入的环境变量
execv 数组 需要可执行程序路径 不导入 使用当前环境变量
execvp 数组 默认在环境变量中找 不导入 使用当前环境变量
execve 数组 需要可执行程序路径 导入 使用导入的环境变量

Linux_进程替换(execl、execlp、execv、execle)相关推荐

  1. linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用

    exec族函数函数的作用:         exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二 ...

  2. linux c execve, execlp, execvp, execle 执行文件 执行二进制 介绍

    首先要明白几点: 1.这些个函数都是exec系列的函数,属于替换进程映像,不产生新的进程,把原来的进程替换掉来执行路径(或文件)指向的程序,从main开始. 2.执行成功没有返回值,失败返回-1,注意 ...

  3. linux 进程函数替换,Linux使用exec函数实现进程替换的代码分享

    这篇文章主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下 Linux 进程替换(exec函数)实现代码# include #include #include #i ...

  4. execve, execlp, execvp, execle比较

    首先要明白几点: 1.这些个函数都是exec系列的函数,属于替换进程映像,不产生新的进程,把原来的进程替换掉来执行路径(或文件)指向的程序,从main开始.        2.执行成功没有返回值,失败 ...

  5. Linux的fork函数和进程替换

    文章目录 一.fork函数 1.使用fork建立子进程 2.fork后 不同进程中的同一变量的虚拟地址 写时拷贝 二.进程替换 一.fork函数 在Linux中,fork函数具有非常重要的作用:它可以 ...

  6. Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】

    linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...

  7. Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用

    exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...

  8. C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve)

    C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve) 简介 本文讲解C语言进程中的exec函数族相关知识,相关函数有excel,exec ...

  9. 【Linux】进程的程序替换(execl、execlp、execle、execvpe等替换函数)

    文章目录 1.进程程序替换 1.1 理解进程替换原理 1.2 进程相应替换函数 1.3 进一步理解程序替换 1.进程程序替换 父进程创建子进程的目的: 1.想让子进程执行父进程代码的一部分.(子承父业 ...

最新文章

  1. 激光打标软件_走向工业自动化生产之路——激光飞行打标
  2. 传蔚来计划回国内科创板上市,关闭硅谷办公室
  3. python redis处理高并发-Python高并发解决方案实现过程详解
  4. 便携式不锈钢管道焊接机器人_不锈钢管道焊接工艺
  5. html.编辑数据回显,从HTML表格编辑/更新MySQL数据库值
  6. mock模拟接口测试 vue_vue+mock.js实现前后端分离
  7. 组成新数python_python练习题
  8. php分片数据库,4、PHP测试分片集群
  9. Horae开启区块链与Token经济时代的 认知革命
  10. 动物棋制作(C语言)
  11. 基于手持技术的中学化学实验教学研究
  12. NUCLEO-STM32H7A3ZI-Q使用说明
  13. 剧本杀游戏app开发
  14. idc服务器租用和虚拟主机区别,云主机与虚拟主机及IDC(托管服务器)的区别
  15. 茶楼收银系统应该如何选择?
  16. 2020年广东工业大学第十届文远知行杯新生程序设计竞赛 A.肥猪的钢琴床(dp动态规划)
  17. 在计算机控制交流电机过程中,钢板彩涂过程中张力控制系统的研究
  18. 黑客技术?没你想象的那么难!——dns劫持篇
  19. 信息系统项目管理师(2022年) —— 第 12 章 项目采购管理
  20. C语法关于数组的运用

热门文章

  1. jQuery $.ajaxSetup方法
  2. java 判断是否是int_java判断是否int类型的方法
  3. android开发我的新浪微博客户端-OAuth篇(2.1)
  4. 九章Twitter 后端系统资源
  5. 为什么索引可以让查询变快
  6. 【尚筹网】IDEA版实现(十二)项目展示
  7. Nginx配置valid_referer解决跨站请求伪造(CSRF)
  8. 美国时间转中国时间,兼容夏令时
  9. 图论经典算法——Dijkstra算法
  10. 校园文化建设计算机教室标语,学校标语:校园文化建设标语