第8章进程控制总结
1 父子进程的程序空间
子进程获得父进程的数据空间、堆、栈的副本,即不共享这些空间
父子进程共享正文段
不过现在又很多实现采用COW写时复制技术,即共享空间,发生修改时只为修改区域制作副本
2 文件共享
父子进程各自维护进程表项(记录有文件描述符、文件描述符标志、文件表指针)
父子进程共享文件表(记录当前文件偏移量、文件状态标志、v节点指针)
一个文件只有一个v节点表
3 vfork
vfork创建的子进程目的是为了调用exec函数
在调用exec函数之前,父子进程共享程序空间(因为调用exec之后,子进程将访问另外的程序空间,调用exec之前没必要单独为子进程复制父进程的程序空间)
vfork保证子进程先运行,直到子进程调用exec或exit函数后父进程才开始运行
4 wait
pid_t wait(int *status) pid_t waitpid(pid_t pid,int *status,int option)
wait函数等待所有子进程中的一个进程终止,将终止状态写入status并返回子进程ID
waitpid函数通过pid、option决定是否阻塞的方式等待某个子进程
对于wait获取的子进程终止状态,可以通过以下宏来判断:
WIFEXITED(status)
WIFSIGNALED(status)
WIFSTOPPED(status)
WIFCONTINUED(status)
waitpid函数再添加一个参数,用来获取子进程的资源使用情况即为wait4函数:
pid_t wait4(pid_t pid,int *status,int option,strcut rusage *rusage)
wait3函数不指定子进程pid
5 exec函数
int execl(const char *pathname,const char *arg0,.../*(char *)0 */) int execv(const char *pathname,char *const argv[])
execl和execv函数的pathname参数指定执行程序的路径(绝对路径、相对路径、或直接是当前目录下的文件名)
exelce和execve添加char *const env[]参数传递环境变量
execlp和execvp的第一个参数如果不是路径名,则在PATH的路径下找执行文件(如果是文件名只会在PATH下寻找,不会在当前目录下寻找)