进程的替换

已知fork()之后,父进程和子进程各自执行父进程代码的一部分。那如果子进程就像执行一个全新的程序呢?

进程替换是通过特定的接口,加载磁盘上的一个权限的程序,加载到调用进程的地址空间中,让子进程执行其他程序。exec*函数本质就是如何加载程序的函数。

本质上:进程替换就是将新的磁盘上的程序加载到内存,并和当前进程的页表,重新建立映射。

进程替换没有创建新的进程

exec*函数的使用

execl

int execl(const char* path,const char*arg, ...)

path是路径+目标文件名

arg,... 我们在命令行怎么执行,这里就怎么给。

...是可变参数列表,即可以传入多个不定个数参数,但最后一个参数必须是NULL,表示参数传递完毕。

execl是程序替换,调用该函数成功之后,会将当前程序的代码和数据全部替换。所以一旦调用成功,进程后续代码均不执行,且不需要返回值。当调用失败时,依然会执行当前代码,excel有返回值-1。

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{printf("当前进程的开始代码\n");execl("/usr/bin/ls","-l","-a","NULL"); // ls -la//execl("/usr/bin/ls","-l","-a","--color=auto","NULL"); 自动高光printf("当前代码的结束代码\n");return 0;}

execv

int execv(const char* path,const char*argv[ ]);//于excel只有传参不同

#define NUM 16
int main()
{pid_t id=fork();if(id==0){//子进程printf("子进程开始运行,pid: %d\n",getpid());sleep(1);//创建const char*类型数组以输入指令const char* _argv[NUM]={(char*)"ls",(char*)"-a".(char*)"-l",NULL};//NUM值任意execv("/usr/bin/ls",_argv);//进程没替换就退出exit(1);}//父进程printf("父进程开始运行,pid:%d\n",getpid());int status=0;pit_t res=waitpid(id,&status,0);//阻塞等待if(res>0){    //等待成功printf("等待成功 子进程退出码:%d\n",WEXITSTATUS(status));}return 0;
}

execlp

int execlp(const char* file,const char*arg,..);

p表示path该函数会自己在环境变量PATH查找文件。

execlp("ls","ls","-a","-l",NULL);

ls表示文件名 第二个ls表示操作

execvp

int execvp(const char* file,const char* argv[]);

execvp("ls",_argv);

execle

int execle(const char*path,const char* argv,...,const char* envp[] )

e代表环境变量

在父进程未fork()之前,创建一个const char*数组,创建一些变量。将该数组通过excele函数传入,子进程可以获取里面的数据。

mycmd

#include <stdio.h>
#include <string.h>
#include <stdlib.h>// ./mycmd -a/-b/-c...
int main(int argc, char *argv[])
{if(argc != 2)//传入的参数不是两个{printf("can not execute!\n");exit(1);}//MY_enc  目前并不存在!printf("获取环境变量: MY_env: %s\n", getenv("MY_env"));if(strcmp(argv[1], "-a") == 0){printf("hello a!\n");}else if(strcmp(argv[1], "-b") == 0){printf("hello b!\n");}else{printf("default!\n");}return 0;
}

测试

#define NUM 16
const char*myfile="home/chy/linux/lesson17/mycmd";
//const char*myfile="./mycmd";
int main()
{const char*_env[NUM]={(char*)"MY_env=12345678",NULL};pid_t id=fork();if(id==0){//子进程printf("子进程开始运行,pid: %d\n",getpid());sleep(1);execle(myfile,"mycmd","-a",NULL,_env);//进程没替换就退出exit(1);}//父进程printf("父进程开始运行,pid:%d\n",getpid());//...return 0;
}

(入门自用)--Linux--进程的替换--0919相关推荐

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

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

  2. Linux系统编程14:进程入门之Linux进程中非常重要的概念之进程地址空间-原来我们看到的地址全部是虚拟的

    文章目录 (1)旧知回顾 (2)程序地址空间? A:同一个地址有两个数据? B:物理地址和虚拟地址 C:进程地址空间及作用 D:进程地址空间如何工作 (1)旧知回顾 学习C/C++总免不了这张图 这张 ...

  3. 【Linux】linux进程--进程控制:进程创建、进程终止、进程等待、进程程序替换

    目录 1.进程创建 1)重温fork():让正在运行的进程创建出来一个子进程:从已存在的进程中创建一个新的进程,新进程为子进程而远进程为父进程. 2)fork内部完成的事情 3)用户空间 & ...

  4. Linux 进程编程入门

    关于进程和线程的关系,之前一口君写过这几篇文章,大家可以参考下. 本文从头带着大家一起学习Linux进程 <搞懂进程组.会话.控制终端关系,才能明白守护进程干嘛的?> <[粉丝问答6 ...

  5. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  6. Linux 进程控制(创建/退出/等待/替换)

    目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...

  7. Linux系统编程18:超详解进程程序替换exec函数的一些用法

    文章目录 (1)进程程序替换是什么 (2)exec-替换函数 (3)实例展示-了解exec函数的替换原理 A:execl和execv B:execlp和execvp C:替换自己的程序和execle ...

  8. Linux系统编程第六节——进程的替换(execl、exelp、execle、execv、execvp、execve)

    本节的内容很简单,就是研究一下进程替换的有关内容即可. 也不存在什么导图了,因为就这一个知识点. 先说一下什么叫进程替换. 说白了,就是一个进程还没有运行完,被掉包了,被换掉了,换成了执行另外一个进程 ...

  9. 进程程序替换((>_<)子进程跑了),模拟编写一个入门shell

    目录 进程程序替换 1.进程替换的原理 2.怎么来另起炉灶执行另一个程序 ①execl ②execv ③execlp ④execvp​编辑 ⑤execle ⑥execvpe 和 execve 3.执行 ...

最新文章

  1. CDMA模块上网设置的过程
  2. 浅谈高风险多团队协同的项目管理方法
  3. XML 序列化 【译】
  4. html 弹窗被拦截,window.open()弹窗被浏览器拦截的解决方法
  5. C++ vector容器类型 (摘自漫步云端的博客)
  6. PostgreSQL 数组类型
  7. python方向键控制角色_用python和pygame游戏编程入门-控制角色移动
  8. 三阶段提交(Three-phase commit)
  9. 基于RV1126平台imx291分析 --- 写在开始
  10. 微商分销代理新零售商城源码
  11. VS2012工具箱控件
  12. 计算机中时序信号的作用是什么,时序信号
  13. 在线文档查看器:Gleamtech Document Viewer 6.6.1
  14. 1047: 阿姆斯特朗数
  15. java代码怎么打印松树_用JAVA画一颗树(Applet)
  16. 培训机构营销技巧与策略
  17. 数据仓库—思维导图讲解数仓体系
  18. 计算机操作系统 教案,计算机操作系统ppt
  19. 拟物风格的小程序附源码
  20. 蓝牙路由器物联网优势是什么?

热门文章

  1. H5页面中调用微信和支付宝支付
  2. web攻击日志分析之入门指南
  3. python可视化词云图WordCloud
  4. 运筹学动态规划matlab代码,运筹学胡运权清华版-7-04动态规划应用举例
  5. R-CNN算法学习(步骤一:候选区域生成)
  6. CDMA 一个m位码片可以有多少与之正交的码片
  7. Linux之LVM管理 pvcreate,vgcreate,lvcreate命令
  8. 使用 totem-pps 在 Ubuntu 下完美地观看 PPS 电影
  9. 第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海),签到题6题
  10. 申请android11xColorOS,零时差适配安卓11!ColorOS 11升级公测版体验丝滑顺畅