波奇学Linux:进程替换

单进程替换

excel使得能够在文件中运行系统指令

int excel (系统文件地址,系统指令,指令参数,NULL);

成功时无返回值,失败时返回-1

波奇学Linux:进程替换_第1张图片

 如图进程成功运行第一个printf后再运行指令,但没有输出第二个printf的内容。本质上发生了程序替换

进程替换原理

波奇学Linux:进程替换_第2张图片

1.进程运行时会把mycommand进程加载到物理内存中,同时创建进程的PCB,进程空间,页表等。

2.进程根据页表映射的数据和代码在cpu上运行。

3.运行Excel函数时发生进程替换,加载ls程序的数据和代码到内存中,改变页表映射的数据和代码。

4.程序直接运行ls的代码直到程序结束,不再运行mycommand剩下的代码。

cpu如何得到ls代码的入口地址

linux中形成的可执行程序是有格式的-ELF,可程序有表头,表头有入口地址。

可执行程序加载到内存中会先加载表头

多进程版进程替换

fork出一个子进程再进程替换掉

波奇学Linux:进程替换_第3张图片

波奇学Linux:进程替换_第4张图片

如图父子进程的pid都保持不变,说明程序替换没有出现出现新进程。

子进程的代码部分发生写时拷贝。

波奇学Linux:进程替换_第5张图片

进程替换接口

波奇学Linux:进程替换_第6张图片

execl:l表示list,参数是可变参数类型

execlp:p表示环境变量的PATH,参数file表明会从环境变量的PATH中搜索

execlv:v表示参数是指针数组

execle:e表示可以传递环境变量给替换的进程

l和v的对比

l:execl("usr/bin/ls","ls","-a","-l",NULL);

//相当于 把"ls" "-a" "-l" 组装起来"ls -a -l"

v:char* const argv[]={"ls","-a","-l",NULL};

execv("usr/bin/ls",argv);

l和lp比较

execl("usr/bin/ls","ls","-a","-l",NULL);

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

波奇学Linux:进程替换_第7张图片

execve才是系统调用,在man手册中的2中,其他都函数最后都会调用execve

结合前几节中的可变参数选项,我们可以推测,所有的进程都execv启动进程

excel进程替换函数调用自定义的进程

调用C++进程

波奇学Linux:进程替换_第8张图片

Makefile同时实现两个程序编译

波奇学Linux:进程替换_第9张图片

1.c++代码Linux下后缀有cpp,cc等

2.编译c++代码,用编译器g++

3.用伪目标实现同时编译两个文件

4.Makefile的逻辑是根据(伪)目标文件all的依赖关系找到otherExe和mycommand文件,再找到目标文件为otherExe和mycommand的依赖关系,开始编译。

5.指令make 实际上make all (第一个目标文件)

调用bash的脚本进程

波奇学Linux:进程替换_第10张图片

波奇学Linux:进程替换_第11张图片

.sh是shell脚本后缀

#! 所有的脚本语言开头都会有这个

user/bin/bash:这是bash解释器的地址

程序替换时,环境变量不会被替换

脚本进程就是文本语言,被解释器解释

实际上python和java也是解释器语言

 不是test.sh运行而是bash程序运行。后面的写法和命令行输入的一致。

波奇学Linux:进程替换_第12张图片

运行python脚本

替换进程接收参数选项和环境变量

波奇学Linux:进程替换_第13张图片

传递的envp覆盖了原来的环境变量。

putenv()函数添加新的变量到环境变量中

在父进程时可以修改环境变量,或者替换进程时将自定义环境变量和参数选项给函数。

本地shell实现

波奇学Linux:进程替换_第14张图片

你可能感兴趣的:(Linux,linux,运维,服务器)