- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中级部分
(操作系统原理和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打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。
最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了。如下图所示:
使用vi编辑器的编辑界面
a与i是相同的用法。
当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc 键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入:q(不带w,只退出不保存)。如下图6.2所示:
退出vi界面
退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc [–o outputfilename] filename.c,其中gcc是c的编译器。参数:filename.c 是刚才编辑的c 文件(当然也可以是以前编写好的c文件);中括号里面的参数是可选的,它是一个输出文件。如果不选,默认的输出文件是a.out ,选了之后输出文件就是outputfilename.
最后一步是运行程序,方法如下:./outputfilename
2 实验内容
(1)进程的创建
编写一段源程序,使用系统调用fork()创建子进程,当此程序运行时,在系统中有父进程和子进程在并发执行。试观察屏幕上的显示结果,并分析原因(源代码:fork.c)。
#include stdio.h
main( )
{
int p1;
while ((p1=fork()) == -1) ;
if (p1 == 0)
printf(i am child process,my pid is %d !\n,getpid());
else
printf(i am parent process!, my pid is %d !\n,getppid());
}
思考:子进程是如何产生的?如何结束的?子进程被创建后它的运行环境是怎样建立的?
解答:子进程是通过调用fork()函数产生的它的运行环境是通过通过fork()返回不同值,从而执行不同程序段。
(2) 父进程创建子进程后,父子进程各自分支中的程序各自私有,其余部分,包括创建前和分支结束后的程序段,均为父子进程共享。(源代码:forkshare_1.c)
#includestdio.h
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)
#includestdio.h
main()
{
int p1;
putchar(x); //父子共享部分,都要输出x
while((p1=fork() )== -1);
if(p1== 0)
{
putchar(b); //子进程输出b后终止执行
exit(0);
}
else
putchar(a);
putchar(y); //只有父进程输出y
}
(4)父进程等待子进程终止的同步常用于下述场合:
当父进程有许多任务要做时,往往会针对每一个任务创建一个子进程去完成,然后再等待每一个子进程的终止。其同步关系是父进程等待子进程。(源代码:wait.c)
实现的方法是:
子进程终止时
文档评论(0)