一 进程地址空间:::
就三个概念 一个是 页表 一个是 地址空间 一个是 物理内存
我们在c 和c++ 里面打印出来的地址 就是虚拟地址
在这里我们创建一个全局变量 global_val; 的值
我们通过父子进程操作 改变 global_val 的值 我们发现 地址都是一样的 但是值是不一样的 ,那么这个地址是实际的物理内存吗? 答案是肯定不是的, 这个是进程地址空间 他们对应一个页表,然后再对应物理内存 我们再实际操作中 能直接访问物理内存吗 答案也是不可以的 我们是通过进程地址空间和页表进而影响物理内存的变化的。。。
二 进程等待
::为什么要让父进程等待
1 子进程退出 父进程如果不管不顾就会造成僵尸进程 进而造成内存泄漏
2 进程一旦变成僵尸进程 kill -9 也杀不死
3 子进程运行完成后 结果对还是不对或者是否正常退出了
4 父进程通过进程等待的方式回收子进程资源 获取子进程的退出信息
等待方法i
#include<sys/tyeps.h>
1 wait(int * status) 2 waitpid(pid_t id ,int * status,int options)
waitpid(id,NULL,0) id 也可以写成-1 -1的话就是等待任意一个子进程的id
status 的值 两个部分 包括 退出状态 和终止信号 正常请客下都为0
用 第16位。获取退出状态可以用 (status>>8)&0xFF , 退出信号(status&x7F);也可以用
WIFEXITED(status) 判断子进程退出 用WEXITSTATUS(status) 获取退出状态
options 如果是9 就是阻塞等待 也可以写成非阻塞等待 WNOHANG
程序替换
如果我想让子进程 执行一个全新的程序的 就需要进程程序替换了
程序的本质就是一个文件 文件=程序的代码 加上程序数据
替换函数:::
进程替换 进程不变仅仅替换当前进程代码和数据的技术, 程序替换的本质 就是程序的代码和数据 加入到特定的进程当中去,execl execle execv execve