如何知道进程在一个空消息队列中放入一个消息?如果阻塞在msgrcv调用中,则除了等待无法做其他事情,如果给msgrcv指定非阻塞标志(IPC_NOWAIT),尽管不阻塞了,但必须持续调用该函数来确定何时有消息到达,也就是采用轮询方式(polling),Posix消息队列允许异步事件通知来通知何时有消息放入到某个空消息队列中,有2种方式:
1)产生一个信号
2)创建一个线程执行一个指定函数
这通过mq_notify建立。
msgget创建一个新的消息队列或访问一个已经存在的消息队列
msgsnd发送一个消息,消息是下面这样的结构体:
但这个预定的结构一般无法满足自己的需求,因此一般定义自己的结构
发送数据时可以指定flag为IPC_NOWAIT,这个标志使得msgsnd调用非阻塞,
调用msgrcv函数时,若type指定为0,则返回消息队列第一个消息,若type小于0,则返回类型值小于或等于type绝对值的消息中类型值最小的
第一个消息
使用两个消息队列来实现前面的客户—服务器例子,一个队列用于从客户方到服务器的消息,一个队列用于从服务器到客户的消息。
第8节使用一个队列来实现单服务器,多客户端的通信,但互斥,死锁可能存在,另一种思路就是为每个实体单独设置一个私有队列,消息都发送到自己的队列中,也只从自己的队列中取消息.
System V的消息队列比Posix消息队列差多了,要使用select模型同时处理网络连接和IPC连接时,必须产生子进程,使用管道作为中介,另外一个弱点是无法Peek一个消息.