西工大计算机操作系统实验报告OS2

  • 格式:doc
  • 大小:412.50 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

评语:

成绩: 指导教师:

实验报告二

实验名称:构造进程家族树

日期:2013-5-16

理解进程的独立空间

一、实验目的:

1. 通过创建若干个子进程,构造进程家族树,分析进程家族树的结构关系;学

习相关系统调用(例如,getpid()和getppid()等)的使用方法。

2. 理解进程是操作系统独立分配资源的单位,进程拥有自己相对独立的程序空

间。

二、实验内容:

1. 进程的创建:编制一段程序,使用系统调用fork()创建三个子进程,在各个子

进程中再使用系统调用fork()进一步创建子进程,如此重复,构造一棵进程家

族树。分别使用系统调用getpid()和getppid()获取当前进程和父进程的

进程标识号并输出。

2. (1)编写一个程序,在其main()函数中定义一个变量shared,对其进行循

环加/减操作,并输出每次操作后的结果;

(2)使用系统调用fork()创建子进程,观察该变量的变化;

(3)修改程序把shared 变量定义到main()函数之外,重复第(2)步操作,观察该变量的变化。

三、项目要求及分析:

1.学习进程构造的相关知识,学习获取进程相关信息的系统调用函数。利用系统调用getpid()和getppid()所获得的进程标识号信息,验证是否进程间关系是否满足要求的进程家族树。

2.了解进程创建和构造的相关知识,了解C语言程序编写的相关知识。

观察进程执行结果,根据进程间的执行关系思考原因,并和线程进行比较。

四、具体实现:

4.1 流程图

1.进程家族树

Pid_1=fork()

Pid_2=fork()

Pid_1<0?

error

Pid_1==0?

输出pid 和ppid

Pid_2<0?

ERROR

Y N

Y Y Pid_2==0?

Pid_2_1=fork()

Pid_2_1<0?

ERROR

Y

Y Pid_2_1==0?

输出pid 和ppid

Pid_2_2=fork()

N

Y

pid1>0?Pid_2_1>0?

Pid_2_2<0?

ERROR

Pid_2_2==0?

输出pid 和ppid

N

Y

Pid_2>0?

Pid_3=fork()

Pid_3<0?

ERROR Pid_3==0?

输出pid 和ppid

N

N Y

Y Y Y

N

N Y

N Y

2.

pid=fork()

ERROR

pid<0pid==0pid>0N

N

Y Y

Y

shared=1

输出shared

操作

输出shared

操作

4.2 添加函数的代码

1.创建进程,实现如下图的进程家族树

#include #include

int main()

int pid_1, pid_2, pid_3, pid_2_1, pid_2_2;

pid_1=fork();

if(pid1<0)

printf(“ERROR\n”);

else if(pid_1==0)

printf(“My father Id is %d, My Id is %d\n”,getppid(), getpid());

else if(pid_1>0)

{

pid_2=fork();

if(pid_2<0)

printf(“ERROR\n”);

else if(pid_2==0)

{

printf(“My father Id is %d, My Id is %d\n”,getppid(), getpid());

pid_2_1=fork();

if(pid_2_1<0)

printf(“ERROR\n”);

else if(pid_2_1==0)

{

printf(“My father Id is %d, My Id is %d\n”,getppid(), getpid());

}

else if(pid_2_1>0)

{

pid_2_2=fork();

if(pid_2_2<0)

printf(“ERROR\n”);

else if(pid_2_2==0)

{

printf(“My father Id is %d, My Id is %d\n”,getppid(), getpi d());

}

}

}

else if(pid_2>0)

{

pid_3=fork();

if(pid_3<0)

printf(“ERROR\n”);

else if(pid_3==0)

{

printf(“My father Id is %d, My Id is %d\n”,getppid(), getpid());

}

}

}

return 0;