第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下寻找,不会在当前目录下寻找)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。