您的位置:首页 > 其它

《Unix内核源码剖析》读书笔记02-进程管理【父进程与子进程】

2015-06-08 17:49 239 查看
一、进程的生命周期

(1)某个进程通过系统调用fork,创建一个用于执行程序的进程。生成此进程的进程称为子进程。子进程通过复制父进程的数据得以创建。

(2)父进程执行系统调用wait,进入等待状态 。

(3)子进程通过系统调用exec将程序读取到内存中并开始执行。

(4)子程序执行完后,通过系统调用exit结束自身运行进入僵尸态。

(5)父进程得到控制权,得到子进程的执行结果后清除子进程。

简言之,进程不会无缘无故地凭空产生,必定有一个父进程。

1 i = fork(); /*返回进程ID*/
2 if(i==0){
3 execv(program_name,argv);
4 exit(); /*防止execv执行失败*/
5 }
6 while(wait() != i);/*wait返回已经结束的子进程的ID*/


父进程执行第一句,创建了子进程然后开始执行第六句,进入等待状态。

注意:这里不能简单地按照C语言顺序执行的理解看上面的代码。

我的理解是父进程执行到第六句时,子进程还在执行第一句,子进程完成fork后,返回0,然后进入if语句,结束自己的进程。而接下来父进程也走出了while语句。【也就是说两条线在执行2-5行代码,父进程和子进程】

二、子进程和父进程之间怎样传递数据?

上面提到,子进程得到父进程的数据,子进程执行完后结果也要返还给父进程。两者之间如何共享数据?

复制proc[]数组元素

子进程的proc.p_ppid指向父进程的proc.p_pid

复制数据段

子进程继承已打开的文件和当前目录等数据

子进程的user.p_procp指向proc[]中代表子进程的元素

子进程和父进程共享text[]中相同的元素【text[]管理代码段】

三、如何确定进程间的父子关系?

1、子进程的proc.p_ppid为父进程的ID

2、父进程通过遍历proc[]找到自己的子进程

-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: