这份文档是西北工业大学针对计算机操作系统课程设计的实验报告指导文件,旨在通过实践操作加深学生对操作系统原理的理解与应用。
本实验报告的主要目的是通过创建多个子进程来构造进程家族树,并学习相关系统调用(如 getpid() 和 getppid() 等)的使用方法。同时,理解进程是操作系统独立分配资源的基本单位,每个进程拥有自己相对独立的空间。
一、构建进程家族树
利用 fork() 系统调用来创建多个子进程,并通过 getpid() 获取当前进程标识号和通过 getppid() 获取父进程标识号,从而输出各个进程中各自的 ID 和其父级的 PID。这样可以构造出一个清晰的进程家族关系图。
二、理解独立的空间概念
定义一个共享变量 shared,在主函数中进行循环加减操作并打印每次操作后的结果。使用 fork() 创建子进程后观察该变量的变化情况,以验证不同进程中对同一内存地址的操作是否相互隔离。
三、项目要求及分析
本实验的主要目标是掌握创建和管理进程的基本知识,学习如何通过系统调用来获取关于当前运行的进程的相关信息,并了解操作系统中有关进程的概念。此外还旨在加深理解 C 语言编程在处理并发任务时的应用技巧。
四、具体实现步骤
1. 使用 fork() 函数来生成新的子进程并构建出一个简单的家族树结构。
2. 在主程序内部定义共享变量 shared 并执行一系列的加减运算,输出每一步操作的结果。
3. 通过调用系统函数 fork() 来创建新线程,并检查在这些不同进程中该共享数据的变化情况。
4. 将上述步骤中的全局变量移出到 main 函数外部进行测试,观察其行为变化。
实验代码如下:
```c
#include
#include
int main()
{
int pid_1, pid_2, pid_3, pid_2_1, pid_2_2;
pid_1=fork();
if(pid_1<0)
printf(ERRORn);
else if(pid_1==0)
printf(My father Id is %d, My Id is %dn, getppid(), getpid());
else if(pid_1>0)
{
pid_2=fork();
if(pid_2<0)
printf(ERRORn);
else if(pid_2==0)
{
printf(My father Id is %d, My Id is %dn, getppid(), getpid());
pid_2_1=fork();
if(pid_2_1<0)
printf(ERRORn);
else if(pid_2_1==0)
{
printf(My father Id is %d, My Id is %dn, getppid(), getpid());
}
else if(pid_2_1>0)
{
pid_2_2=fork();
if(pid_2_2<0)
printf(ERRORn);
else if(pid_2_2==0)
{
printf(My father Id is %d, My Id is %dn, getppid(), getpid());
}
}
else if(pid_2>0)
{
pid_3=fork();
if(pid_3<0)
printf(ERRORn);
else if(pid_3==0)
{
printf(My father Id is %d, My Id is %dn, getppid(), getpid());
}
}
}
return 0;
}
```
实验结果表明,通过 fork() 系统调用能够成功构建进程家族树,并且可以获取每个进程中各自的 ID 和父级的 PID。同时通过对共享变量的操作验证了不同进程间拥有独立的工作空间这一特性。