实验四:进程通信(二)
实验目的:
学习如何利用消息缓冲队列进行进程间的通信,并加深对消息缓冲队列通信机制的理解。
实验内容:
(1) 了解系统调用msgget()、msgsnd()、msgrcv()、msgctl()的功能和实现过程。
(2) 编写一段程序,使其用消息缓冲队列来实现父进程和子进程之间的通信。
0.父进程先建立一个关键字为MSGKEY(如75)(即#define MSGKEY 75)的消息队列,然后等待接收类型为1的消息;
1.在收到请求消息后,它便显示字符串“serving for client ”和接收到的子进程的进程标识数,表示正在为子进程服务;
2.然后再向子进程发送一应答消息,该消息的类型是该子进程的进程标识数,而正文则是父进程自己的标识数。
3.子进程则向消息队列发送类型为1的消息(消息的正文为自己的进程标识数),以取得父进程的服务,并等待父进程发来的应答;然后显示字符串“receive reply from ”和接收到的父进程的标识数。
消息的结构为:
struct msgform{
long mtype; //消息类型
char mtext[1024]; //消息正文
};
思考:
(1)消息缓冲机制是否提供了发送进程和接收进程之间的同步功能?同步是如何进行的?
答:
首先进程同步的定义是:我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
消息队列允许任意进程通过共享队列来进行进程间通信。并由系统调用函数来实现消息发送和接收之间的同步。从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题,使用相对方便。
(2) 消息缓冲机制有什么特点,它适合于何种场合?
答:
消息队列与管道方式的区别在于,消息队列可以实现多对多,并需要在内存中实现,而管道可以在内存或磁盘上实现。
消息队列中信息的复制需