os实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

中级部分(操作系统原理和linux操作系统相结合的实验)实验一进程的创建一实验目的1学会使用vi编辑器编辑C语言程序2学会Linux环境下gcc的使用3学会调试工具GDB的使用二实验原理1利用系统调用设计程序,加深对进程概念的理解。2体会系统进程调度的方法和效果。三实验环境PC机1台,Windows操作系统和其上的虚拟Linux操作系统。四实验步骤1实验预备知识:使用编辑器vi编辑文件A)进入linux的文本模式之后,在命令行键入vifilename.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[–ooutputfilename]filename.c,其中gcc是c的编译器。参数:filename.c是刚才编辑的c文件(当然也可以是以前编写好的c文件);中括号里面的参数是可选的,它是一个输出文件。如果不选,默认的输出文件是a.out,选了之后输出文件就是outputfilename.F)最后一步是运行程序,方法如下:./outputfilename2实验内容(1)进程的创建编写一段源程序,使用系统调用fork()创建子进程,当此程序运行时,在系统中有父进程和子进程在并发执行。试观察屏幕上的显示结果,并分析原因(源代码:fork.c)。#includestdio.hmain(){intp1;while((p1=fork())==-1);if(p1==0)printf(iamchildprocess,mypidis%d!\n,getpid());elseprintf(iamparentprocess!,mypidis%d!\n,getppid());}思考:子进程是如何产生的?如何结束的?子进程被创建后它的运行环境是怎样建立的?解答:子进程是通过调用fork()函数产生的它的运行环境是通过通过fork()返回不同值,从而执行不同程序段。(2)父进程创建子进程后,父子进程各自分支中的程序各自私有,其余部分,包括创建前和分支结束后的程序段,均为父子进程共享。(源代码:forkshare_1.c)#includestdio.hmain(){intp1;putchar('x');//父子共享部分,都要输出'x'while((p1=fork())==-1);if(p1==0)putchar('b');//子进程输出'b'elseputchar('a');//父进程输出'a'putchar('y');//父子共享部分,都要输出'y'}(3)如果子进程在其分支结束处使用了进程终止exit()系统调用而终止执行,则不会再共享分支结束后的程序段。(源代码:forkshare_2.c)#includestdio.hmain(){intp1;putchar('x');//父子共享部分,都要输出'x'while((p1=fork())==-1);if(p1==0){putchar('b');//子进程输出'b'后终止执行exit(0);}elseputchar('a');putchar('y');//只有父进程输出'y'}(4)父进程等待子进程终止的同步常用于下述场合:当父进程有许多任务要做时,往往会针对每一个任务创建一个子进程去完成,然后再等待每一个子进程的终止。其同步关系是父进程等待子进程。(源代码:wait.c)实现的方法是:子进程终止时执行exit()向父进程发终止信号,父进程使用wait()等待子进程的终止。运行下面的程序并分析结果。#includestdio.hmain(){intp1;while((p1=fork())==-1);if(p10){wait(0);//父进程等待子进程终止putchar('a');}else{putchar('b');exit(0);//子进程向父进程发终止信号0}}(5)Linux中子进程映像的重新装入创建一个子进程,并给它加载程序,其功能是显示“Iamachild”。设被加载的程序路径名为./child。分析:由于子进程需要加载的程序比较简单,不带参数,所以可以使用execl()实现加载。A).编辑子进程要加载的程序:(源代码为:child.c)#includestdio.h#includeunistd.hmain(){printf(Iamachild\n);exit(0);}编译链接,查看该程序执行后的结果并记下该文件的路径名和文件名是:./childB)编辑父进程创建子进程并加载的程序(child_parent.c)#includeunistd.h#includestdio.hmain(){intp;while((p=fork())==-1);//创建子进程if(p==0)//子进程返回execl(./child,0);//加载子进程的程序else//父进程返回{wait(0);//等待子进程终止exit(0);}}实验二进程的通信一实验目的1学会使用vi编辑器编辑C语言程序2学会Linux环境下gcc的使用3学会调试工具GDB的使用二实验原理1利用linux提供的进程通信的系统调用设计进程通信程序,加深对进程通信概念的理解。2体会进程通信的方法和效果。三实验环境PC机1台,Windows操作系统和其上的虚拟Linux操作系统。四实验步骤1.管道通信(1)编写一个程序。父进程创建一个子进程和一个无名管道fd,由子进程向管道写入信息“Thisisamessage”,然后终止执行;父进程接收到子进程终止信号后从管道中读出并显示信息后结束。#includestdio.h#includeunistd.hmain(){intp1,fd[2];charoutpipe[50];//定义读缓冲区charinpipe[50]=Thisisamessage!;//定义写缓冲区pipe(fd);//创建无名管道fdwhile((p1=fork())==-1);if(p1==0)//子进程返回{write(fd[1],inpipe,50);//写信息到管道exit(0);}else//父进程返回{wait(0);//等待子进程终止read(fd[0],outpipe,50);//从管道读信息到读缓冲区printf(%s\n,outpipe);//显示读到的信息exit(0);}}(2)父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。(源程序pipe_1.c)#includestdio.hmain(){intI,r,j,k,l,p1,p2,fd[2];charbuf[50],s[50];pipe(fd);while((p1=fork())==-1);if(p1==0){lockf(fd[1],1,0);sprintf(buf,Childprocessp1issendingmessage!\n);printf(Childprocessp1!\n);write(fd[1],buf,50);lockf(fd[1],0,0);sleep(5);j=getpid();k=getppid();printf(p1%disweakup.Myparentprocessidis%d.\n,j,k);exit(0);}else{while((p2=fork())==-1);if(p2==0){lockf(fd[1],1,0);sprintf(buf,Childprocessp2issendingmessage!\n);printf(Childprocessp2!\n);write(fd[1],buf,50);lockf(fd[1],0,0);sleep(5);j=getpid();k=getppid();printf(p2%disweakup.Myparentprocessidis%d.\n,j,k);exit(0);}else{I=getpid();wait(0);if(r=read(fd[0],s,50)==-1)printf(can’treadpipe.);elseprintf(Parent%d:%s\n,l,s);wait(0);if(r=read(fd[0],s,50)==-1)printf(can’treadpipe);elseprintf(Parent%d:%s\n,l,s);exit(0);}}}结果:2.共享内存通信。编程实现消息的发送与接收:发送进程将要发送的消息从键盘输入,每输入一行就作为一条消息发送,用“end”作为结束消息。(源代码:sndshm.c)接收进程从消息队列上逐个取出消息并显示输出,也用“end”作为结束消息。通过先运行发送进程然后再运行接收进程的方式来实现同步。(源代码:rcvshm.c)发送进程源代码:sndshm.c如下:#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/types.h#includelinux/shm.hmain(){intshmid;/*定义共享内存内部标识shmid*/char*viraddr;/*定义附接共享内存的虚拟地址*/charbuffer[BUFSIZ];/*定义存放信息的字符型数组*/shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT);/*创建共享内存*/viraddr=(char*)shmat(shmid,0,0);/*附接到进程的虚拟地址空间*/while(1)/*循环输入信息*/{puts(Entersometext:);fgets(buffer,BUFSIZ,stdin);strcat(viraddr,buffer);/*采用追加方式写到共享内存*/if(strncmp(buffer,end,3)==0)/*输入为“end”时结束*/break;}shmdt(viraddr);/*断开附接*/exit(0);}接收进程源代码:rcvshm.c如下:#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/types.h#includelinux/shm.hmain(){intshmid;char*viraddr;shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT);/*获取共享内存*/viraddr=(char*)shmat(shmid,0,0);/*附接到进程的虚拟地址空间*/printf(Yourmessageis:\n%s,viraddr);/*输出信息内容*/shmdt(viraddr);/*断开附接*/shmctl(shmid,IPC_RMID,0);/*撤消共享内存*/exit(0);}结果如下,由屏幕输出的结果看出,发送进程发送到共享内存中的信息已经被接收进程接收了。3消息缓冲通信。发送进程将要发送的消息从键盘输入,每输入一行就作为一条消息发送,用“end”作为

1 / 41
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功