http://www.moon4chen.com/

linux fork

1. 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。多执行几次,观察并记录屏幕上的显示结果,分析原因, 写入实验报告。

截图:

clip_image002

原因:如下图解释

clip_image004

2. 修改上述程序,每一个进程循环显示一句话。子进程显示'daughter…'及'son…',父进程显示 'parent…',多执行几次,观察并记录屏幕上的显示结果,分析原因, 写入实验报告。

同1一样

clip_image006

3. 利用vi编辑器,创建源代码文件ft1.c,内容如下

#include <stdio.h>

int main(void)

{

int i;

for(i=0; i<2; i++)

{

fork();

printf("-");

}

return 0;

}

观察并记录屏幕上的显示结果,分析原因,写入实验报告。

结果:

clip_image008

原因:

这时,打印出的“-”被执行了8次,可以从下图(手画)得到解释:

clip_image010

4. 修改ft1.c,内容如下

#include <stdio.h>

int main(void)

{

int i;

for(i=0; i<2; i++)

{

fork();

printf("-\n");

}

return 0;

}

注意代码的修改,多执行几次,观察并记录屏幕上的显示结果,分析原因,写入实验报告。

clip_image012

打印出6次,理由是加上\n后,printf被立刻打印,所以子进程不会复制父进程的缓冲内容;即只打印6次,分别出处如下:

clip_image014

5. 总结性解释说明:为什么fork()调用一次,返回两次

在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,

fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,

因为子进程没有子进程,所以其fpid为0.

posted @ 2015-03-30 18:06  谌皓徽  阅读(1214)  评论(0编辑  收藏  举报