操作系统实验报告
实验3-1: Linux进程的创建与父子进程同步
1.实验目的
(1)熟悉在C语言源程序中使用Linux所提供的系统调用界面的方法;
(2)掌握Linux中进程的创建方法以及调度执行情况,理解进程与程序的区别;
(3)使用系统调用wait()和exit(),实现父子进程同步;
(4)了解Linux提供的C编译器gcc的调用;
(5)进一步掌握vi的使用。
2.实验内容
(1)父进程创建子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次后使用sleep(1)延时1秒,然后再进入下一次循环,如下所示。将该源程序链接后执行,观察并分析运行结果。
父进程返回后执行:
子进程返回后执行:
(2)进程家族树
在源程序中连续使用4个fork(),而不是用if()进行返回值的判段,在4个fork()语言后面输出字符“A”。观察并分析该程序编译连接执行后的输出结果。
(3)父子同步进程
修改第(1)题的程序,使用exit()和wait()实现父子进程同步,其同步方式为父进程等待子进程的同步,即:子进程先循环输出5次,然后父进程再循环输出5次.观察是否有不同的结果出现。
3.实验思考(实验指导书有的就回答)
(1)观察运行结果,分析结果产生的原因。
(2)当程序中创建了子进程后,该程序的执行有什么特点?为什么?
答:由fork创建的子进程是与父进程相似的进程,子进程基本上是父进程的复制。
父进程和子进程可以并发执行,子进程可以共享父进程的正文段和已打开的文件。
(3)如果连续创建多个子进程而不使用条件进行各自空间的分隔,会出现什么情况?
请画出第(2)题实验的进程家族树。
(4)如何实现父子进程之间的父进程等待子进程的同步?
答:父子进程的同步主要表现在两个方面:1.父进程读出之前确定管道中有数据,否则阻塞自己,这一点通过系统调用wait()函数既可以实现,当子进程结束时父进程才执行,那么此时管道中肯定有子进程写入的数据了;2.子进程在写入之前要确定管道中的数据已被父进程读出,否则不能写入或者阻塞自己。
4.实验代码(需要编码的就回答)
(实验1代码清单)
#include <stdio.h>
main()
{
linux下的sleep函数int p1,i;
while ((p1=fork())==-1);
if (p1>0)
for (i=0;i<5;i++)
{
printf("I am parent.\n");
sleep(1);
}
else
for (i=0;i<5;i++)
{
printf("I am child.\n");
sleep(1);
}
}
(实验2代码清单)
#include <stdio.h>
main()
{
fork();
fork();
fork();
fork();
putchar('A'); //每个进程都要输出‘A’}
(实验3代码清单)
#include <stdio.h>
main()
{
int p1,i;
while ((p1=fork())==-1);
if (p1>0)
{
wait(0);
for (i=0;i<5;i++)
{
printf("I am parent.\n");
sleep(1);
}
}
else
{
for (i=0;i<5;i++)
{
printf("I am child.\n");
sleep(1);
}
exit(0);
}
}
5.程序运行结果(给出截图)
(实验1 运行结果截图)
(实验2 运行结果截图)
(实验3 运行结果截图)
6.实验心得
在上操作系统这门课的时候,由于在课堂上对操作系统的一些问题缺乏深入的理解,所以在开始做实验的时候有些无厘头,没有自己的编程想法,只能跟着实验指导书上的内容按部就班,其中也遇到不少麻烦问题。
但是,在实验的过程中,我也慢慢认真详细阅读并分析实验指导书上的要求,明确实验目标和如何简
便操作代码,把不懂的细节问题出来,然后作为重点去解决。同时,在班上卢武湘和刘盛杰同学的帮助下,我很快顺利完成了本次实验要求的内容。
通过本次实验,让我对进程的创建有更深的理解,是我真真切切的理解到进程和程序的本质区别。学会了如何使用基本命令进行调试和运行程序。
总之这让我受益非浅。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论