os实验

更新时间:2023-03-18 00:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中级部分

(操作系统原理和linux操作系统相结合的实验)

实验一 进程的创建

一 实验目的

1 学会使用vi编辑器编辑C语言程序 2 学会Linux环境下gcc的使用 3 学会调试工具GDB的使用

二 实验原理

1 利用系统调用设计程序,加深对进程概念的理解。 2 体会系统进程调度的方法和效果。

三 实验环境

PC机1台,Windows操作系统和其上的虚拟Linux操作系统。

四 实验步骤

1 实验预备知识:使用编辑器vi 编辑文件

A)进入linux的文本模式之后,在命令行键入vi filename.c 然后回车。

下面作一些简单的解释:首先vi命令是打开vi编辑器。后面的filename.c是用户即将编辑的c文件名字,注意扩展名是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。

B) 最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键

(insert),插入的意思,就可以进入编辑模式了。如下图所示:

使用vi编辑器的编辑界面

C) a与i是相同的用法。

D) 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上

的Esc 键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入:q(不带w,只退出不保存)。如下图6.2所示:

退出vi界面

E) 退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc [–o

outputfilename] filename.c,其中gcc是c的编译器。参数:filename.c 是刚才编辑的c 文件(当然也可以是以前编写好的c文件);中括号里面的参数是可选的,它是一个输出文件。如果不选,默认的输出文件是a.out ,选了之后输出文件就是outputfilename. F) 最后一步是运行程序,方法如下:./outputfilename

2 实验内容

(1)进程的创建

编写一段源程序,使用系统调用fork()创建子进程,当此程序运行时,在系统中有父

进程和子进程在并发执行。试观察屏幕上的显示结果,并分析原因(源代码:fork.c)。 #include main( ) {

int p1;

while ((p1=fork()) == -1) ; if (p1 == 0)

printf(\ else

printf(\}

思考:子进程是如何产生的?如何结束的?子进程被创建后它的运行环境是怎样建立的? 解答:子进程是通过调用fork()函数产生的它的运行环境是通过通过fork()返回不同值,从

而执行不同程序段。

(2) 父进程创建子进程后,父子进程各自分支中的程序各自私有,其余部分,包括创建前

和分支结束后的程序段,均为父子进程共享。(源代码:forkshare_1.c) #include main() { int p1; putchar('x'); //父子共享部分,都要输出'x' while((p1=fork()) == -1); if(p1==0) putchar('b'); //子进程输出'b' else putchar('a'); //父进程输出'a' putchar('y'); //父子共享部分,都要输出'y' }

(3)如果子进程在其分支结束处使用了进程终止exit()系统调用而终止执行,则不会再共享

分支结束后的程序段。(源代码:forkshare_2.c) #include main() { }

int p1;

putchar('x'); //父子共享部分,都要输出'x' while((p1=fork() )== -1); if(p1== 0) { } else

putchar('a');

putchar('y'); //只有父进程输出'y'

putchar('b'); //子进程输出'b'后终止执行 exit(0);

(4)父进程等待子进程终止的同步常用于下述场合:

当父进程有许多任务要做时,往往会针对每一个任务创建一个子进程去完成,然后再等待每一个子进程的终止。其同步关系是父进程等待子进程。(源代码:wait.c) 实现的方法是:

? 子进程终止时执行exit()向父进程发终止信号, ? 父进程使用wait()等待子进程的终止。 运行下面的程序并分析结果。 #include main() { else

int p1;

while((p1=fork())== -1); if(p1>0) { } {

putchar('b');

wait(0); //父进程等待子进程终止 putchar('a');

}

}

exit(0); //子进程向父进程发终止信号0

(5)Linux中子进程映像的重新装入

创建一个子进程,并给它加载程序,其功能是显示“I am a child‖。设被加载的程序路径名为./child。

分析:由于子进程需要加载的程序比较简单,不带参数,所以可以使用execl()实现加载。 A). 编辑子进程要加载的程序:(源代码为:child.c) #include

#include main() { printf(\ exit(0); }

编译链接,查看该程序执行后的结果并记下该文件的路径名和文件名是:./child B)编辑父进程创建子进程并加载的程序(child_parent.c) #include #include main() { int p;

while((p=fork())== -1); if(p==0) execl(\ else { wait(0); exit(0); } }

//创建子进程 //子进程返回 //加载子进程的程序 //父进程返回 //等待子进程终止

本文来源:https://www.bwwdw.com/article/o78f.html

Top