操作系统实验:进程的创建

实验名称:进程的创建实验

一、实验目的:

1.      加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。

2.      认识进程生成的过程,学会使用fork生成子进程,并知道如何使子进程完成与父进程不同的工作。

 

二、实验要求:

1.  将下面的程序编译运行,并解释现象。
#include < sys/types.h >
#include < stdio.h >
#include < unistd.h >

int main(){

   int pid1=fork();

   printf(“**1**\n”);

   int pid2=fork();

   printf(“**2**\n”);

   if(pid1==0){intpid3=fork();printf(“**3**\n”);}

   else printf(“**4**\n”);

   return 0;

}

2.  通过实验完成第三章习题3.4。

3.  编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。

 

 三、实验过程:

1.  将题目1中的代码写进test.c文件中并编译运行,得到如图所示的结果。

分析如下:

主程序中产生两个子进程,记为进程1和进程2。pid1的值和pid2的值均不为0。由于主进程中pid1值不为0,所以没有产生第三个进程。因此主进程输出1、2、4。

进程1中,由于pid1值为0,所以又产生了两个子进程,记为进程3和进程4,pid2为子进程返回值,不为0。因此进程1输出1、2、3。

进程2中,由于pid1不为0,因此没有产生子进程,输出2、4。

进程3中,pid1值为0,因此产生了一个子进程,记为进程5,输出2、3。

进程4中,接着intpid3=fork();的下一句执行,输出了3。

进程5中,同样输出了一个3。

由于程序执行时,各个进程的顺序并不是按照分析那样依次执行,因此输出的顺序有所不同。按照此结果,进程执行顺序是主进程、进程2、进程1、进程3、进程2、进程5。

(另外值得注意的是,我的Linux在执行此程序时,每次出来的结果都不一样,我认为是在执行多个进程时,哪个进程先执行是系统随机选择的)

2.  将题目2中的代码写进test3.c文件中并编译运行,得到如图所示的结果。

操作系统实验:进程的创建

PARENT:value= 5.

当控制回到父进程时,它的值会保持在5,而子进程将更新并拷贝这个值。

3. test2.c代码如图

操作系统实验:进程的创建

如图,pid1=0时表示正在执行第一个子进程,pid2为0时表示正在执行第二个子进程。

分析如下

主进程产生两个子进程,而第一个子进程中又产生了同第二个子进程相同的一个子进程,因此主进程(pid1不为0, pid2不为0)输出a,第一个子进程(pid1=0, pid2不为0)输出b,第二个子进程(pid1不为0,pid2=0)输出c,第一个子进程的子进程(pid1= pid2=0)输出b、c。

操作系统实验:进程的创建