excel使得能够在文件中运行系统指令
int excel (系统文件地址,系统指令,指令参数,NULL);
成功时无返回值,失败时返回-1
?如图进程成功运行第一个printf后再运行指令,但没有输出第二个printf的内容。本质上发生了程序替换
1.进程运行时会把mycommand进程加载到物理内存中,同时创建进程的PCB,进程空间,页表等。
2.进程根据页表映射的数据和代码在cpu上运行。
3.运行Excel函数时发生进程替换,加载ls程序的数据和代码到内存中,改变页表映射的数据和代码。
4.程序直接运行ls的代码直到程序结束,不再运行mycommand剩下的代码。
cpu如何得到ls代码的入口地址
linux中形成的可执行程序是有格式的-ELF,可程序有表头,表头有入口地址。
可执行程序加载到内存中会先加载表头
fork出一个子进程再进程替换掉
如图父子进程的pid都保持不变,说明程序替换没有出现出现新进程。
子进程的代码部分发生写时拷贝。
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);
execve才是系统调用,在man手册中的2中,其他都函数最后都会调用execve
结合前几节中的可变参数选项,我们可以推测,所有的进程都execv启动进程
调用C++进程
Makefile同时实现两个程序编译
1.c++代码Linux下后缀有cpp,cc等
2.编译c++代码,用编译器g++
3.用伪目标实现同时编译两个文件
4.Makefile的逻辑是根据(伪)目标文件all的依赖关系找到otherExe和mycommand文件,再找到目标文件为otherExe和mycommand的依赖关系,开始编译。
5.指令make 实际上make all (第一个目标文件)
调用bash的脚本进程
.sh是shell脚本后缀
#! 所有的脚本语言开头都会有这个
user/bin/bash:这是bash解释器的地址
程序替换时,环境变量不会被替换
脚本进程就是文本语言,被解释器解释
实际上python和java也是解释器语言
?不是test.sh运行而是bash程序运行。后面的写法和命令行输入的一致。
运行python脚本
传递的envp覆盖了原来的环境变量。
putenv()函数添加新的变量到环境变量中
在父进程时可以修改环境变量,或者替换进程时将自定义环境变量和参数选项给函数。