《操作系统》实验报告
年级、专业、班级 实验题目 实验时间 2015-10-31 2013级计科6班 姓名 张行 进程间通信 实验地点 0410 □验证性 □设计性 □综实验成绩 实验性质 合性 教师评价: □算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理; □实验结果正确; □语法、语义正确; □报告规范; 其他: 评价教师签名: 一、实验目的 ? 了解管道通信的特点,掌握管道通信的使用方法。 ? 了解消息队列通信机制及原理,掌握消息队列相关系统调用的使用方法及功能。 二、实验项目内容 管道通信--实验内容: ? 1.父进程创建管道和两个子进程p1和p2 ? 2.子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,写完关闭文件,然后向管道写入一条消息“ok\,目的是通知进程p2可以读取文件内容了。 报告创建时间:
? 3.子进程p2通过管道读取消息,如果消息是“ok”,则打开文件,读取文件内容,并将其输出到屏幕上,关闭文件. ? 消息队列--实验内容 ? 父进程创建消息队列和两个子进程p1和p2 ? 子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,写完关闭文件,然后向消息队列写入一条消息“ok”,目的是通知进程p2可以读取文件内容了。 ? 子进程p2从消息队列读取消息,如果收到消息“ok”,则打开文件,读取文件内容,并将其输出道屏幕上,关闭文件。 三、实验过程与算法 int pipe(int fd[2]) 功能:创建管道 int read(int fd, void *buf, int count); 功能:从参数fd指定的读端读取管道数据到大小为count的缓存buf中,返回实际读取到的字节数。 int write(int fd, void *buf, int count); 功能:向参数fd指定的写端从缓存buf中取出count个字节到管道中,返回值为实际写入的字节数 int msgsnd(int msqid, const void * ptr, size_t nbytes, int flag) 功能:往消息队列写消息,即发送消息。 int msgrcv(int msqid, const void * ptr, size_t nbytes ,long type, int flag) ; 功能:从消息队列读消息,即接收消息。 管道代码如下:
#include
exit(1); } else if(childpid2 == 0) { printf(\ close(w_fd);//close read byte = read(r_fd,readbuffer,sizeof(readbuffer)); if(strcmp(\ { if((fp=fopen(\ { printf(\ return; } while((fgets(s,20,fp))!=NULL) { printf(\ } fclose(fp); } } else { wait(NULL); } } return 0; } 消息队列代码如下: #include
printf(\ return -1; } int mgsid; if((mgsid=msgget(key,IPC_CREAT|0666))== -1) { printf(\ return -1; } pid1=fork(); if(pid1<0) { printf(\ exit(1); } else if(pid1==0) { printf(\ printf(\ sleep(1); struct msgbuff msg1; msg1.mtype=getppid(); if((fp=fopen(\ { printf(\ return; } fputs(\ fclose(fp); strcpy(msg1.data,\ if(msgsnd(mgsid,&msg1,sizeof(msg1.data),0)<0){ printf(\ exit(1); } else{ printf(\ exit(0); } } else { wait(NULL);