操作系统第一次实验,进程管理。编程环境Linux+gcc
这篇文章是在我自己实验报告的基础上,改进而来
1.进程的创建(必做题)
编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b” 和“c”。试观察记录屏幕上的显示结果,并分析原因。
<参考程序>
# include<stdio.h>
main()
{ int p1, p2;
while((p1=fork())= = -1);
if(p1= =0)
putchar(‘b’); /*在子进程1中*/
else /*在父进程中*/
{ while((p2=fork())= =-1);
if(p2= =0)
putchar(‘c’); /*在子进程2中*/
else /*在父进程中*/
putchar( ‘a’);
}
}
我的实验过程:
1. 运行虚拟机virtualbox,打开终端,开始编辑,在这里我使用的是gredit
这里我编程的C语言文件时TestFork.c
2. 在C语言文件中,编辑相应代码:
3. 对程序进行编译连接运行
具体是在终端中输入以下的shell指令:
4. 运行结果:
4. 分析
fock函数调用一次却返回两次;向父进程返回子进程的ID,向子进程中返回0,这是因为父进程可能存在很多过子进程,所以必须通过这个返回的子进程ID来跟踪子进程,而子进程只有一个父进程,他的ID可以通过getppid取得。
看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是if(p1==0)。。。。。
两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1. 在父进程中,fork返回新创建子进程的进程ID;
2.在子进程中,fork返回0;
3.如果出现错误,fork返回一个负值;
参考文献:http://blog.csdn.net/farsight2009/archive/2009/09/04/4518560.aspx
3.编写程序创建进程树如图1所示,在每个进程中显示当前进程识别码和父进程识别码。(必做题)
1. 编写程序:
3. 运行结果: