1 .实验目的
学习如何利用消息缓冲队列进行进程间的通信,并加深对消息缓冲队列通信机制的理解。
2 .实验内容
(1) 了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。
(2) 编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。父进程先建立一个关键字为MSGKEY(如75)(即#define MSGKEY 75)的消息队列,然后等待接收类型为1的消息;在收到请求消息后,它便显示字符串“serving for client ”和接收到的子进程的进程标识数,表示正在为子进程服务;然后再向子进程发送一应答消息,该消息的类型是该子进程的进程标识数,而正文则是父进程自己的标识数。子进程则向消息队列发送类型为1的消息(消息的正文为自己的进程标识数),以取得父进程的服务,并等待父进程发来的应答;然后显示字符串“receive reply from ”和接收到的父进程的标识数。
3 .实验步骤
(1) 了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。
msgget()
功能:得到消息队列标识符或创建一个消息队列对象
msgctl()
功能:获取和设置消息队列的属性
msgsnd ()
功能:将消息写入到消息队列
msgrcv()
功能:从消息队列读取消息
(2) 编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。父进程先建立一个关键字为MSGKEY(如75)(即#define MSGKEY 75)的消息队列,然后等待接收类型为1的消息;在收到请求消息后,它便显示字符串“serving for client ”和接收到的子进程的进程标识数,表示正在为子进程服务;然后再向子进程发送一应答消息,该消息的类型是该子进程的进程标识数,而正文则是父进程自己的标识数。子进程则向消息队列发送类型为1的消息(消息的正文为自己的进程标识数),以取得父进程的服务,并等待父进程发来的应答;然后显示字符串“receive reply from ”和接收到的父进程的标识数。
程序代码:
#include<stdio.h>
#include<sys/msg.h>
#define MSGKEY 75
struct msgform{
long mtype;
char mtext[1024];
};
int main(){
int id;
struct msgform msg;
id=msgget(MSGKEY,0777|IPC_CREAT);
if(fork()==0){
msg.mtype=1;
sprintf(msg.mtext,"%d",getpid());
msgsnd(id,&msg,sizeof(msg),0);
sleep(1);
msgrcv(id,&msg,sizeof(msg),0,0);
printf("receive reply form %s\n",msg.mtext);
}else{
msgrcv(id,&msg,sizeof(msg),0,0);
if(msg.mtype==1){
printf("%d\n",getpid());
printf("serving for client,%s\n",msg.mtext);
sprintf(msg.mtext,"%d",getpid());
msgsnd(id,&msg,sizeof(msg),0);
sleep(2);
msgctl(id,IPC_RMID,0);
}
}
return 0;
}
程序截图:
运行结果:
3 .思考
自己写的,有些地方不准确,如果错误还请指正
(1) 消息缓冲机制是否提供了发送进程和接收进程之间的同步功能?同步是如何进行的?
是。当写进程把一定数量的数据写入pipe,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空的pipe时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进程的同步。
(2) 消息缓冲机制有什么特点,它适合于何种场合?
消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送和接收之间的同步.从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题。使用方便,但是信息的复制需要额外消耗CPU的时间,不适宜于信息量大或者操作频繁的场合。
如果文章对你有用的话点个赞鼓励一下吧!
今天的文章计算机操作系统 实验四:进程通信(二)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32076.html