操作系统实验报告3

上传人:lis****211 文档编号:147279095 上传时间:2022-09-01 格式:DOCX 页数:15 大小:42.70KB
收藏 版权申诉 举报 下载
操作系统实验报告3_第1页
第1页 / 共15页
操作系统实验报告3_第2页
第2页 / 共15页
操作系统实验报告3_第3页
第3页 / 共15页
资源描述:

《操作系统实验报告3》由会员分享,可在线阅读,更多相关《操作系统实验报告3(15页珍藏版)》请在装配图网上搜索。

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

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

3、 hid io . h,# 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 : X

4、u ) jpr i in fC 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

5、 y151too tlocaIhos 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种结果:(1) 若运行到fork()时,出现错误,则输出“fork() error.”

6、,程序故障 终止。(2) 由于程序运行时产生两个进程,由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.Jp

7、arent process doesnt change 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()函数创

8、建进程的 C语言程序,其程序代码如下图3所示: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)

9、;for(ptr=environ; * ptr!=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

10、加 i iid-(l(ilp( rir ini 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

11、Jhos t roo tlocaIhos t 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”

13、,在终端输入“gcc jyexit1.c o 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 t

14、locaIhos troo tloca1hos 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”对程 序进行编译,如果编译没有错误,继续在终端输

15、入“./jyexit2”,即可看到 程序运行结果,其运行截图如下图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

16、 t2.croot# gcc j yexi t2.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虚拟机中,右击屏幕,选择“

17、新建终端”,打开终端,输入 命令“vi jy156.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 i

18、nt i( parejit s context 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

19、 hn ) j ex i t(0)se Isel 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 ch

20、ildl terminate, chiId2 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)时,同样也被阻

21、塞,此时跳到父进程中执行,执行到第 一个wait(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)(p

23、r 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 tlocaIhos t root# gcc jyfzjcc -o j yfzj crootlocaIhost root# ,/jyfzjcchi 1dl process isJchild2 pr

24、ocess isYparent process isJYrootlocaIhost root# |图15程序运行截图分析:上图可知产生了一种结果:先输出进程1,在运行进程2,最 后运行父进程,即JYJY。由程序可知函数fork创建子进程后,形成了 3 个并发进程,每个进程执行都用可能。putchar输出语句时间很短,产生 的结果不止上面一种,还有可能是JYJY,YJJY.等几种结果。四、实验过程与分析在做实验的过程中,我了解到了几种进程创建的方法,以及这些方法 的区别。通过利用系统调用fork()和vfork()创建子进程,创建成功后,父 进程返回的是被创建子进程的标识,给子进程自己返回的是0

25、,创建失败 时,返回给父进程的是-1,以及fork()和vfork()的区别,fork创建后子进程 和父进程是并发执行的。vfork()创建成功后,父进程被挂起,子进程先执 行,直到子进程结束后,再执行父进程。调用exec()函数是用来进程调用 来运行一个新程序,之后该进程的代码段.数据段和堆栈段被新程序所代 替。新程序从自己的main()函数开始进行。系统调用exit()函数是来终止 自己进程,wait()函数是用来阻塞父进程来等待子进程,实现了父子进程 的同步,而sleep()函数阻塞子进程。五、实验总结通过本次实验,我了解到了进程创建的各种方法,理解了如何创建 一个进程,如何改变进程执行的程序,如何终止进程和如何完成父子进程 的同步等,提高了自己对进程控制系统调用的编程能力。为以后深入地学 习操作系统打下了基础。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!