操作系统实验报告

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

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

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

资源描述

操作系统实验报告学号:姓名:指导老师:完成日期:目录实验一.............................................................................................1实验二.............................................................................................2实验三.............................................................................................7实验四...........................................................................................10实验五...........................................................................................15实验六...........................................................................................18实验七...........................................................................................221实验一UNIX/LINUX入门一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。二、实验内容熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。练习UNIX/LINUX的文本行编辑器vi的使用方法熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验程序#includestdio.h#includestdlib.hintmain(){printf(HelloWorld!\n);return0;}五、实验感想通过第一次室验,我了解UNIX/LINUX运行环境,熟悉了UNIX/LINUX的常用基本命令,熟悉和掌握了UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。2实验二进程管理一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(3)进程的管道通信编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、功能设计(1)进程创建使用fork()创建两个子进程,父进程等待两个子进程执行完再运行。(2)进程控制使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话再运行。(3)进程的管道通信先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。2、数据结构子进程和管道。3、程序框图3五、实验程序(1)进程创建#includestdio.h#includestdlib.hintmain(){intpid1,pid2;pid1=fork();if(pid10){printf(Fork1failed!!);}if(pid1==0){printf(b\n);exit(0);}if(pid10){wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(pid2==0){printf(c\n);exit(0);}if(pid20){wait(NULL);printf(a\n);exit(0);}}}(2)进程控制4#includestdio.h#includestdlib.hintmain(){intpid1,pid2;pid1=fork();if(pid10){printf(Fork1failed!!);}if(pid1==0){printf(Thisischildb\n);exit(0);}if(pid10){wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(pid2==0){printf(Thisischildc\n);exit(0);}if(pid20){wait(NULL);printf(Thisisfathera\n);exit(0);}}}(3)进程的管道通信#includestdio.h#includestdlib.h#includesys/types.h#includememory.hintmain(){intpid1,pid2;intpfd[2];char*msg1=Child1issendingamessage!;char*msg2=Child2issendingamessage!;charbuf[256];intr,w;if(pipe(pfd)0){printf(pipecreateerror!\n);exit(1);}pid1=fork();if(pid10){printf(Fork1failed!!);}if(pid1==0){close(pfd[0]);//writesleep(3);if(w=write(pfd[1],msg1,strlen(msg1))0){printf(wirteerror!\n);exit(1);}else{printf(child1sendmsgtopipe!\n);}5exit(0);}if(pid10){wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(pid20){close(pfd[1]);//readsleep(3);if(r=read(pfd[0],buf,256)0){printf(readerror!\n);exit(1);}else{printf(parentreadfrompipe:%s\n,buf);}wait(NULL);close(pfd[1]);//readsleep(3);if(r=read(pfd[0],buf,256)0){printf(readerror!\n);exit(1);}else{printf(parentreadfrompipe:%s\n,buf);}}if(pid2==0){close(pfd[0]);//writesleep(6);if(w=write(pfd[1],msg2,strlen(msg2))0){printf(writeerror!\n);exit(1);}else{printf(child2sendmsgtopipe!\n);}exit(0);}}}六、实验结果6从图中可以看出,分别输出了,三个字母,三句话,实现了子进程向管道写数据,父进程从管道中读出。七、实验感想通过本次实验,我们对进程的概念加深了理解,熟悉了进程的创建方法与作用机制,明确了进程与程序的异同。同时,我们掌握了使用管道通信的机制,进一步认识了并发执行的实质。7实验三一个进程启动另一个程序的执行一、实验目的编写Linux环境下,fork()与exec()的结合使用实现一个进程启动另一个程序的执行的基本方法,掌握exec()的几种调用方法。二、实验内容父进程从终端读取要执行的命令,并交给子进程执行。父进程等待子进程结束,并打印子进程的返回值。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、功能设计根据实验要求,父进程和子进程将被分配不同的任务:父进程从终端读取要执行的命令交给子进程,然后等待子进程技术打印子进程的返回值;子进程执行父进程读取的命令并返回给父进程。因为子进程执行命令需要打开其他文件,所以需要使用exec()类的函数实现在一个进程来启动另一个程序,在这里应使用execlp()函数从PATH环境变量中查找文件并执行。对于父进程,可以调用fget()从终端读取要执行的命令,以字符串形式存储然后交给子进程执行,待子进程执行完毕后接收子进程返回值并打印。由于要求带参数的命令也可以执行,那么需要在父进程中fets两次,第一次gets得到命令给串command,然后gets参数给串command1,并且将这两个参数分别传到子进程的exec()函数,其中前两个都是command,第三个是command1。2、数据结构用char*型全局变量command存放指令用char*型全局变量command1存放参数3、程序框图8五、实验程序#includestdio.h#includestdlib.h#includestring.h#includeunistd.hcharcommand[256];charcommand1[256];intmain(){intrtn;//子进程的返回数值interrorno;while(1){printf();//从终端读取要执行的命令fgets(command,256,stdin);printf();//从终端读取要执行命令的参数fgets(command1,256,stdin);command[strlen(command)-1]='\0';command1[strlen(command1)-1]='\0';if(fork()==0){//子进程执行此命令errorno=(command1[0]==0)?:execlp(command,command,NULL,NULL),execlp(command,command,command1,NULL);//如果没有参数则前者的execlp()函数,9如果有参数则执行后者,有无参数只需看command1[0]是否为0perror(command);//如果exec函数返回,表明没有正常执行命令,打印错误信息exit(errorno);}else{//父进程,等待子进程结束,并打印子进程的返回值wait(&rtn);printf(childprocessreturn%d\n,rtn);}}return0;}六、实验结果由图可知,执行了ls命令,参数为-a,文件按字母顺序显示如上图所示,输入命令ls,输入参数-a,输出文件夹的内容。七、实验感想通过本次实验,我学会了如何用execlp()函数达到一个进程启动另外一个程序的目的。并且对execlp()的几个参数的作用有了一定了解,别且对于fork()和exelp()联合使用的方法和功能。同时,我们进一步熟悉了LINUX系统操作环境,学

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

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

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

×
保存成功