操作系统实验报告3_第1页
操作系统实验报告3_第2页
操作系统实验报告3_第3页
操作系统实验报告3_第4页
操作系统实验报告3_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、甘肃政法学院本科生实验报告(三)姓名:贾燚学院:计算机科学学院专业:信息管理与信息系统班级:2010级信管实验课程名称:操作系统试验实验日期:2012年9月20日指导教师及职称:何珍祥实验成绩:开课时间:2012-2013学年 第一学期甘肃政法学院实验管理中心印制实验题目进程的创建小组合作。是 否姓名贾燚 班级 2010级信管学 号201081020108一、实验目的理解和掌握UNIX (和Linux)进程控制系统调用的功能。理解如何创建一个进程、改变进程执行程序、进程的终止和父子进程同步。提高对进程控制系统调用的编程能力二.实验环境Windows XP+Linux 虚拟机三、实验内容与步骤1

2、.利用fork。函数创建进程用fork()函数创建进程时,语句调用系列如下:Pit_t fork(void); fork() 函数是一个单调用双返回的函数,也就是说,该函数有父进程调用,执行 时,在父进程中返回子进程标识,在子进程中返回0。fork()调用后,子进 程是父进程的一个复制,都是从fork()调用语句开始执行。进入VM虚拟机中,右击屏幕,选择“新建终端”,打开终端,输入 命令“vi jy151.c”,新建一个名为“jy151.c”的用fork()函数创建进程的C 语言程序,其程序代码如下图1所示:文件。煽辑(直查看也终端转到项帮助(Wg i lie luck hid io . h,

3、i im lnd-E l n lud-e lii t glnb=3:int rra iiiCvd idp id_ l pid; iii t Idc=3;pr int be fore faik( ) lDd=1Gd , l=%d , i ,.g lob h Idc):i f( (pid=fqrkt) )0)pr i n t f(T fork() e ri ot .ex i t(0)e I i1(p id=0)g ljh+;Icc一- :e I快wa ii(0)ipr iin ft pa rent process doe t(lie f lob and lo : Xu ) jpr i in fC

4、J? Iob=%d, loc=itdi hg lobt k)c) j ex i t(0);图1 jy151.c代码用“Esc+: wq”,退出并保存程序“jy151.c”,在终端输入“gcc jy151.c o jy151”对程序进行编译,如果编译没有错误,继续在终端输入“./jy151”, 运行用fork()函数创建进程的程序“jy151.c”,即可看到程序结果,其运行 截图如下图2所示:攵件史)蝙辑酒查看也终端转到帮助曲tootlocaIhos t root# vi jy 151.ctootlocaIhos t root# gcc j y151.c -o j y151too tlocaIh

5、os t root# ./jyl51before forkO ;glod=3t loc=3.child process changes glob and loc:parent process doesnt change the glob and loc: glob=41loc=2parent process doesnt change the glob and loc: glob=31loc=3tootlocaIhos t root#图2程序运行截图分析:程序运行的情况可能有3种结果: 若运行到fork()时,出现错误,则输出“fork() error.”,程序故障 终止。由于程序运行时产生两

6、个进程,由main()函数产生一个父进程 以及程序执行中通过调用fork()函数产生一个子进程。当执行到fork()后形 成两个并发进程。根据系统调度情况,可能产生两种运行结果为:第一种:before foriO:glob = 3, loc = 3. pchild process changes glob and looglob = 4JOC =2*Jparent process doesnt change the glob and loc*glob = 3rloc =3*J第二种:before foriQzglob = 3, loc = 3.Jparent process doesnt ch

7、ange th已 glob and loc*glob = 3,loc = 3child process changes glob and lot*glob = 4 Joe = 22.利用vfork()函数创建进程用vfork()函数创建进程时,语句调用系列如下:Pit_t vfork(void);用 vfork()函数创建进程是,通常使用exec()函数紧跟其后,以便为新创建的 进程指派另一个可执行程序。进入VM虚拟机中,右击屏幕,选择“新建终端”,打开终端,输入 命令“vi jy152.c”,新建一个名为“jy152.c”的用vfork()函数创建进程的 C语言程序,其程序代码如下图3所示:

8、roDl&tocaft文件【旦煽辑世 查看也 略端转到rg)帮助fine ludpine lude sy7type & . h# LI1C lud int g lob=3i ii t fid in( vo id)1p id_l pid:int lcc=S ji f (p id=vfork( )includeint main(int argc,char * argv)riint n;char * * ptr ;extern char * * eAv iron;for(n=0;nargc;n+)printf(argv%d:%snir TnTargvn);for(ptr=environ; * ptr

9、!=O;ptr+)pr in t f (H%sn * ptr);exi t(0);图5 jy153.c代码继续输入命令“vi jy154.c”,新建一个名为“jy154.c”的调用“jy153.c的C语言程序,其程序代码如下图6所示:1 include yid ici.liJ1 in 匚Nnc Iuduri i Uh)jl inc 1 udef: i HQh上i I C(iu.i ijiidCjiid .M7LL.C()jir iF FL 枇EltMRr rr-m:i lt? id-ferK n(jir * furk errur I tn1中 I 加 i iid-(l(ilp( rir ini

10、 1 .rrinll .argl .char *flle-x i H :1i I CCI:I图6 jy154.c代码用“Esc+: wq”,分别退出并保存程序“jy153.c”和“jy154.c”,在终 端输入 “gcc jy153.c -o jy153” 和 “gcc jy154.c -o jy154” 对程序分别进行 编译,如果编译没有错误,继续在终端输入“/jy154”,运行用exec()函数 调用程序“jy153.c”,其运行截图如下图7所示:文粗与 瞬瑛智 黄苛少 斡瑜覆 橙到坦 布瞅也roo tlocaIhos t roo tloca Jhos t roo tlocaIhos t

11、roo tlocaIhos t roo tloca Jhos targv0:jyl53a rgv 1 : a rg I argv2:arg2 USER二roo troot# root# roo I.# root# root#v i j y!53c gcc jyl53,c -o jyl53 v i j yl54 T cgM jyl54.c -o jyl54 /jyl54PATH=/root/rootlocalhost root#图7程序运行截图分析:先运行子进程jy153.c,生成子进程可执行文件,在运行源程 序,当运行到execle()时,调用子进程的可执行文件的路径,传递的参数 有可执行程序

12、的路径名、程序所需参数及程序执行的环境变量。故执行结 果为 arg0:jy153(即程序),arg1:arg1,arg2:arg2(即参数)和 USER=root, PATH=/root/即环境变量)。4.进程终止函数exit()在Linux系统中,进程通过执行系统调用exit()来终止自己。进入VM虚拟机中,右击屏幕,选择“新建终端”,打开终端,输入 命令“vi jyexit1.c”,新建一个名为“jyexit1.c”的用exit()函数终止进程的 C语言程序,其程序代码如下图8所示;用“Esc+: wq”,退出并保存程 序“jyexit1.c”,在终端输入“gcc jyexit1.c o

13、jyexit1 ”对程序进行编译, 如果编译没有错误,继续在终端输入“./jyexit1”,即可看到程序运行结果, 其运行截图如下图9所示:. 一一文编辑旧 查看也 终端 转到鱼; 布助也includema in()(printf(rthis i s a exi t sys tem call! n):exi t(0);printf(TFthis sentence never be d i sp layen: nT,):图 8 jyexit1.c 代码tiro 井辑 吉看憧 捧靴d 转到小)fffl/wroot# vi jyexi 11.croo tlocaIhos troo tloca1hos

14、 t root# gcc j yexi 11.c -o jyexitlroot# ./jyexitlroot1 ocaIhos tthis is a exit systemcall!rootloca1host root#图9程序运行截图继续输入命令“ vi jyexit2.c”,新建一个名为“jyexit2.c的用exit() 函数终止进程的C语言程序,其程序代码如下图10所示;用“Esc+: wq”, 退出并保存程序“jyexit2.c”,在终端输入“gcc jyexit2.c o jyexit2”对程 序进行编译,如果编译没有错误,继续在终端输入“./jyexit2”,即可看到 程序运行结

15、果,其运行截图如下图11所示:交件也蝙轴E百君地 座就转W也带勒JDincludc rni in()printf(Trthis i s a _exi t_tes t system call! nu); prin t f(Tr conten t in hu I fern): exi t(0);rootlocalhDsL图 10 jyexit2.c 程序文l”E;编辑(;查看性 终端摆 转到(蔓花助(K;rootlocaIhos trootlocaIhos trootlocaIhos t this is a _exi troot# v i j yexi t2.croot# gcc j yexi t

16、2.c -o j yexi t2 root# ./jyexit2 tes t sys tern call!content in buf ferroo tlocaIhos t root# |图11程序运行截图分析:系统调用exit()来终止自己,所以在第一个程序中:当程序执 行到exit(0)时,程序将结束,不再执行下一句,所以输出只有一条语句。5. wait()函数和sleep()函数编写一个父子进程同步的实例,并分析结果,改变其sleep()的参数, 观察结果,理解体会wait()和sleep()函数各自的功能。进入VM虚拟机中,右击屏幕,选择“新建终端”,打开终端,输入 命令“vi jy1

17、56.c”,新建一个名为“jy156.c”的用wait()函数和sleep()函数 来控制父子进程的C语言程序,其程序代码如下图12所示;用“Esc+: wq”,退出并保存程序 “jy156.c”,在终端输入 “gcc jy156.c o jy156对 程序进行编译,如果编译没有错误,继续在终端输入“ ./jy156”,即可看 到程序运行结果,其运行截图如下图13所示:ODl砌文件史)蝙辑查看G? 终端(E 转到也)帮助QDQinclude ma i 11() (l ii L p id 1 !i f(p id=fork()if(forkO)pr int i( parejit s context

18、 hi ) jpr int f( parejit s vs i t ijig the ch ii Id 1 termina te hn ) j va i t(0)ipr int f( parent s vs i t ijig t tie child? ternnina te i ws i t(0)pr ijit f( parejit termijia tes : ex i t(0);J e Ipr int f( ch i Id2 1 s context hi ) j slee p(5);pr int f( Wh i Id2 ternnina tes hn ) j ex i t(0)se Ise

19、l f(p idl=0)p r iji t f ( ch l Id 1 1 s con tex t h slee p(10):图12 jy156.c代码丈ftL查看史】 湃布工 估刊(口 吊他岌rootlocaIhost root# vi jyl56.crootlocalhost root# gcc jyl56,c -o jy156rootlocaIhost root# -/jyl56chi 1dIf s context, ch i 1d2 T s cnnt ex L, parents context. parents waiting the childl terminate, chiId2

20、terminates T parents waiting the chi 1d2 terminate, childl Ierminates, parent terminates, rootloca 1 has t root#,图13程序运行截图分析:该程序是父进程首先创建一个子进程,若成功,再创建另一个 子进程,之后三个进程并发执行,它们运行是随机的,上图是其中的一种 情况,由运行结果可知程序的运行顺序,子进程创建成功后,首先开始子 进程1执行,当执行到sleep(10)时,子进程1被阻塞,接着执行子进程2, 当执行到sleep(5)时,同样也被阻塞,此时跳到父进程中执行,执行到第 一个wai

21、t(0)时被阻塞,此时由于子进程2的睡眠时间比子进程1的时间短, 系统此时唤醒了子进程2,当子进程2执行exit(0)后结束子进程2,父进 程再次被唤醒,继续执行父进程,当执行到第二个wait(0)时再次被阻塞, 此时跳到子进程1执行,直到运行到exit(0)后退出子进程1,父进程再次 继续执行直到结束。6.编写一段程序,父进程使用 fork()创建两个子进程,利用输出函数 putchar和函数printf,父进程显示字符串” JY”,两个子进程分别显示 “j”和“y”。多次运行该程序,观察并记录屏幕上的显示结果,分析原 因。进入VM虚拟机中,右击屏幕,选择“新建终端”,打开终端,输入 命令“

22、vi jyfzjc.c”,新建一个名为“jyfzjc.c”的用putchar函数和printf函 数对父子进程输入不同的字符的C语言程序,其程序代码如下图14所示; 用“Esc+: wq,退出并保存程序“jyfzjc.c,在终端输入“gcc jyfzjc.c o jyfzjc”对程序进行编译,如果编译没有错误,继续在终端输入“/jyfzjc”, 即可看到程序运行结果,其运行截图如下图15所示:#in.c 1 ucle# include#includci nt rr目 i n()(int pid;if(pid=tork()(i f( forkO)(pr i nt f(1, par ent process is n1f);Jrintf(1Fjr);pr intf(nh);(v f 7. i r . cr,i,转握撇 I.一 4 1 XC 12.4而端-图 14 jyfzjc.c 代码rool&localhast;文件E; 编辑(K; 查看(0 终端 转到,:H; 帮助H;roo tlocaIhos t root# v i j yfzj c.croo tlocaIh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论