Linux_进程替换(execl、execlp、execv、execle)
当我们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)相关推荐
- linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用
exec族函数函数的作用: exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二 ...
- linux c execve, execlp, execvp, execle 执行文件 执行二进制 介绍
首先要明白几点: 1.这些个函数都是exec系列的函数,属于替换进程映像,不产生新的进程,把原来的进程替换掉来执行路径(或文件)指向的程序,从main开始. 2.执行成功没有返回值,失败返回-1,注意 ...
- linux 进程函数替换,Linux使用exec函数实现进程替换的代码分享
这篇文章主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下 Linux 进程替换(exec函数)实现代码# include #include #include #i ...
- execve, execlp, execvp, execle比较
首先要明白几点: 1.这些个函数都是exec系列的函数,属于替换进程映像,不产生新的进程,把原来的进程替换掉来执行路径(或文件)指向的程序,从main开始. 2.执行成功没有返回值,失败 ...
- Linux的fork函数和进程替换
文章目录 一.fork函数 1.使用fork建立子进程 2.fork后 不同进程中的同一变量的虚拟地址 写时拷贝 二.进程替换 一.fork函数 在Linux中,fork函数具有非常重要的作用:它可以 ...
- Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】
linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...
- Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用
exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...
- C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve)
C语言进程(第三章,exec函数族,execl,execlp,execle,execv,execvp,execve) 简介 本文讲解C语言进程中的exec函数族相关知识,相关函数有excel,exec ...
- 【Linux】进程的程序替换(execl、execlp、execle、execvpe等替换函数)
文章目录 1.进程程序替换 1.1 理解进程替换原理 1.2 进程相应替换函数 1.3 进一步理解程序替换 1.进程程序替换 父进程创建子进程的目的: 1.想让子进程执行父进程代码的一部分.(子承父业 ...
最新文章
- 激光打标软件_走向工业自动化生产之路——激光飞行打标
- 传蔚来计划回国内科创板上市,关闭硅谷办公室
- python redis处理高并发-Python高并发解决方案实现过程详解
- 便携式不锈钢管道焊接机器人_不锈钢管道焊接工艺
- html.编辑数据回显,从HTML表格编辑/更新MySQL数据库值
- mock模拟接口测试 vue_vue+mock.js实现前后端分离
- 组成新数python_python练习题
- php分片数据库,4、PHP测试分片集群
- Horae开启区块链与Token经济时代的 认知革命
- 动物棋制作(C语言)
- 基于手持技术的中学化学实验教学研究
- NUCLEO-STM32H7A3ZI-Q使用说明
- 剧本杀游戏app开发
- idc服务器租用和虚拟主机区别,云主机与虚拟主机及IDC(托管服务器)的区别
- 茶楼收银系统应该如何选择?
- 2020年广东工业大学第十届文远知行杯新生程序设计竞赛 A.肥猪的钢琴床(dp动态规划)
- 在计算机控制交流电机过程中,钢板彩涂过程中张力控制系统的研究
- 黑客技术?没你想象的那么难!——dns劫持篇
- 信息系统项目管理师(2022年) —— 第 12 章 项目采购管理
- C语法关于数组的运用