进程控制II
目录
进程程序替换
exec系列函数
minishell实现
小知识
进程程序替换
一个进程要执行一个不同的程序,例如子进程调用exec函数。
原理:进程程序替换是通过特定的接口,加载磁盘上的一个全新的程序(代码和数据),加载到调用进程的地址空间中,替换原代码和数据。
注:
1.程序替换中,未创建新进程
2.替换之后原程序代码不会再执行
3.程序替换失败会返回-1,成功无返回值
4.在子进程中进行程序替换,不会影响父进程,会在内存地址空间中新开代码和数据的存储区,然后让子进程的页表重新映射。
exec系列函数
l(list):表示参数采用列表(可变参数)
v(vector):参数用数组
p(path):表示自动搜索环境变量
e(env):表示需要传环境变量表
path:要执行的程序的路径
arg:传递给新程序的参数,一般为要执行的程序名
...:给程序传递的命令行选项(可变参数)
file:要执行的程序名称
注:1.在...后要加NULL,在argv结尾要有NULL。
对于环境变量,如果即想设置自定义的,又想用系统默认的,就通过putenv函数向系统默认的环境变量表中添加,然后在调用exece系列函数时,直接传environ即可。
还有一个系统调用,上面的6个全都是对这个的封装
minishell实现
分5步走
1.输出命令提示符
2.获取用户输入的命令
3.把用户输出的命令行字符串解析成命令行参数
4.exec系列函数执行命令/内建命令
main.cpp文件
myshell.h文件
myshell.cpp文件
![]()
小知识
1.命令行中的命令比如ls等也是bash创建子进程然后进行程序替换执行的。
2.二进制文件,必须先从磁盘加载到内存中,因为冯诺依曼体系规定,CPU不能直接访问外设,只能访问内存。
3.环境变量在进程的地址空间中,如果不以参数形式传给子进程,子进程也是可以使用的,因为子进程继承了父进程的虚拟地址空间,程序替换只会替换代码和数据,更改页表映射,其余不会变。