实验名称:进程的创建实验
一、实验目的:
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。