操作系统实验报告(共27页).docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《操作系统实验报告(共27页).docx》由会员分享,可在线阅读,更多相关《操作系统实验报告(共27页).docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上操作系统实验报告 学 号: 姓 名: 指导老师: 完成日期: 目录实验一1实验二2实验三7实验四10实验五15实验六18实验七22专心-专注-专业实验一 UNIX/LINUX入门一、实验目的了解 UNIX/LINUX 运行环境,熟悉UNIX/LINUX 的常用基本命令,熟悉和掌握UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。二、实验内容 熟悉 UNIX/LINUX 的常用基本命令如ls、who、pwd、ps 等。练习 UNIX/LINUX的文本行编辑器vi 的使用方法熟悉 UNIX/LINUX 下c 语言编译器cc/gcc 的使用方法。用vi 编写
2、一个简单的显示“Hello,World!”c 语言程序,用gcc 编译并观察编译后的结果,然后运行它。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验程序#include #include int main() printf (Hello World!n); return 0;五、实验感想通过第一次室验,我了解 UNIX/LINUX 运行环境,熟悉了UNIX/LINUX 的常用基本命令,熟悉和掌握了UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。实验二 进程管理一、实验目的加深对进程概念的理解,明确进程与程序的区
3、别;进一步认识并发执行的实质。二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(3)进程的管道通信编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1 和P2 分别向管道各写一句话:Child 1 is sending a me
4、ssage!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计 1、功能设计(1)进程创建使用fork()创建两个子进程,父进程等待两个子进程执行完再运行。(2)进程控制使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话再运行。(3)进程的管道通信 先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。 2、数据结构 子进程和管道。
5、 3、程序框图 五、实验程序(1)进程创建#include#includeint main() int pid1, pid2;pid1=fork();if (pid10) wait(NULL);pid2 = fork(); if (pid20) wait(NULL);printf(an);exit(0); (2)进程控制#include#includeint main() int pid1, pid2;pid1=fork();if (pid10) wait(NULL);pid2 = fork(); if (pid20) wait(NULL); printf(This is father an)
6、; exit(0); (3)进程的管道通信#include#include#include#includeint main() int pid1, pid2; int pfd2;char *msg1=Child 1 is sending a message!;char *msg2=Child 2 is sending a message!; char buf256; int r,w; if(pipe(pfd)0) printf(pipe create error!n); exit(1);pid1 = fork();if (pid10) printf(Fork 1 failed!); if (p
7、id1=0) close(pfd0); /writesleep(3);if(w=write(pfd1,msg1,strlen(msg1)0) wait(NULL);pid2 = fork(); if(pid20) close(pfd1); /read sleep(3); if(r=read(pfd0,buf,256)0) printf(read error!n);exit(1); else printf(parent read from pipe: %sn,buf); wait(NULL); close(pfd1); /read sleep(3); if(r=read(pfd0,buf,256
8、)0) printf(read error!n);exit(1); else printf(parent read from pipe: %sn,buf); if(pid2=0) close(pfd0); /write sleep(6); if(w=write(pfd1,msg2,strlen(msg2)0) printf(write error!n);exit(1); else printf(child 2 send msg to pipe!n); exit(0); 六、实验结果从图中可以看出,分别输出了,三个字母,三句话,实现了子进程向管道写数据,父进程从管道中读出。七、实验感想通过本次实
9、验,我们对进程的概念加深了理解,熟悉了进程的创建方法与作用机制,明确了进程与程序的异同。同时,我们掌握了使用管道通信的机制,进一步认识了并发执行的实质。实验三 一个进程启动另一个程序的执行一、实验目的编写 Linux 环境下,fork()与exec()的结合使用实现一个进程启动另一个程序的执行的基本方法,掌握exec()的几种调用方法。二、实验内容父进程从终端读取要执行的命令,并交给子进程执行。父进程等待子进程结束,并打印子进程的返回值。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、功能设计根据实验要求,父进程和子进程将
10、被分配不同的任务:父进程从终端读取要执行的命令交给子进程,然后等待子进程技术打印子进程的返回值;子进程执行父进程读取的命令并返回给父进程。因为子进程执行命令需要打开其他文件,所以需要使用exec()类的函数实现在一个进程来启动另一个程序,在这里应使用execlp()函数从PATH环境变量中查找文件并执行。对于父进程,可以调用fget()从终端读取要执行的命令,以字符串形式存储然后交给子进程执行,待子进程执行完毕后接收子进程返回值并打印。由于要求带参数的命令也可以执行,那么需要在父进程中fets两次,第一次gets得到命令给串command,然后gets参数给串command1,并且将这两个参数
11、分别传到子进程的exec()函数,其中前两个都是command,第三个是command1。2、数据结构用char*型全局变量command存放指令用char*型全局变量command1存放参数3、程序框图五、实验程序#include #include#include#includechar command256;char command1256;int main()int rtn; /子进程的返回数值int errorno;while(1) printf( ); /从终端读取要执行的命令fgets( command, 256, stdin );printf( ); /从终端读取要执行命令的参数
12、fgets( command1, 256, stdin );commandstrlen(command)-1 = 0;command1strlen(command1)-1 = 0;if ( fork() = 0 ) /子进程执行此命令errorno=(command10=0)?:execlp(command, command, NULL, NULL), execlp(command, command, command1, NULL);/如果没有参数则前者的execlp()函数,如果有参数则执行后者,有无参数只需看command10是否为0perror( command ); /如果exec函数
13、返回,表明没有正常执行命令,打印错误信息exit(errorno);else /父进程, 等待子进程结束,并打印子进程的返回值wait ( &rtn );printf( child process return %dn, rtn );return 0;六、实验结果由图可知,执行了ls命令,参数为-a,文件按字母顺序显示如上图所示,输入命令ls,输入参数-a,输出文件夹的内容。七、实验感想通过本次实验,我学会了如何用execlp()函数达到一个进程启动另外一个程序的目的。并且对execlp()的几个参数的作用有了一定了解,别且对于fork()和exelp()联合使用的方法和功能。同时,我们进一步
14、熟悉了LINUX系统操作环境,学习了在LINUX环境下编译和调试程序的技巧。实验四 基于消息队列和共享内存的进程间通信一、实验目的Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:1. Linux 支持的消息通信机制及其使用方法2. Linux 系统的共享存储区的原理及使用方法。二、实验内容1消息的创建、发送和接收使用消息调用 msgget()、msgsnd()、msggrev()、msgctrl()编制长度为1K 的消息的发送和接收程序。2共享存储取得创建、附接和断接使用系统调用 shmget()、shmat()、shmctl()、shmct
15、l(),编制一个与上述功能相同的程序。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、消息的创建、发送和接收(1)功能设计为了实现进程之间消息的创建、发送和接收,首先应定义两个子进程,Server进程负责发送,Client进程负责接收,父进程负责创建。其次需要用到msgget()、msgsnd()、msggrev()、msgctrl()等函数进行对消息的控制。题目要求消息长度为1K,那么msgsnd(id,msgp,size, flag)和msgrcv(id,msgp,size,type,flag)函数中参数size应设为
16、1024,msgget(key,flag)中的key应为75。父进程获得创建消息后,子进程Server先后发送编号为110的10条消息,子进程Client先后接收这10条消息,方能达到实验目的。(2)数据结构消息(mymsg):结构体实现,包含的成员变量有消息类型和消息内容,具体实现如下:struct mymsg/消息的结构体声明long int mymsgtype;/消息类型int text;/消息内容(3)程序框图2、共享存储区的创建、附接和断接(1)功能设计为了实现进程通过共享存储区进行通信,需要创建两个进程并且调用shmget()、shmat()、shmctl()函数实现共享存储区的创
17、建、附接和断接。由于共享存储区的写入和读取由两个子进程完成,而共享存储区在本程序中为所有进程共用的,因此共享存储区的创建、附接和断接均需要在父进程中完成。具体的实现方式是现在父进程中创建一块共享存储区,然后用int类型指针list指向该存储区的地址;接着创建两个子进程,第一个子进程通过list指针实现向共享存储区写入int类型的数据,第二个子进程通过list指针实现从共享存储区读出int类型的数据。由于两个子进程同时使用了list指针,所以需要控制两个进程互斥,在读进程序中添加了sleep(1)语句。(2)数据结构通过shmid=shmget (key ,size ,flag)函数建立(获得)
18、共享存储区,返回该共享存储区的描述符shmid。(3)程序框图五、实验程序1、消息的创建、发送和接收#include#include#include#include#include#include#define MAX 1024#define KEY 75struct mymsg/消息结构体long int mymsgtype;/消息类型int text;/消息内容msg;int main()pid_t pids; pid_t pidc; int msgid; int i=1;msgid=msgget(KEY,0666|IPC_CREAT);/获得一个消息的描述符if(pids=fork()=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 27
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内