前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点。
1、消息队列
消息队列的实现分为两种,一种为System V的消息队列,一种是Posix消息队列;这篇文章将主要围绕Posix消息队列介绍;
消息队列可以认为是一个消息链表,某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到,这一点与管道和FIFO相反。Posix消息队列与System V消息队列的区别如下:
(1) 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任意指定优先级的消息。
(2)当往一个空队列放置一个消息时,Posix消息队列允许产生一个信号或启动一个线程,System V消息队列则不提供类似的机制。
2、消息队列的基本操作
2.1 打开一个消息队列
#include
typedef int mqd_t;
mqd_t mq_open(const char *name, int oflag, ... /* mode_t mode, struct mq_attr *attr */);
返回: 成功时为消息队列描述字,出错时为-1。
功能: 创建一个新的消息队列或打开一个已存在的消息的队列。
2.2 关闭一个消息队列
#include
int mq_close(mqd_t mqdes);
返回: 成功时为0,出错时为-1。
功能: 关闭已打开的消息队列。
2.3 删除一个消息队列
#include
int mq_unlink(const char *name)
返回: 成功时为0,出错时为-1
功能: 从系统中删除消息队列。
这三个函数操作的代码如下:
#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
int flag = O_RDWR | O_CREAT | O_EXCL;
int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
mqd_t mqid = mq_open("/mq_test", flag, mode,NULL);
if (mqid == -1)
{
printf("mqueue create failed!\n");
return 1;
}
else
{
printf("mqueue create success!\n");
}
mq_close(mqid); return 0;
}
#include
#include
int main(int argc, char* argv[])
{
mq_unlink("/mq_test");
return 0;
}
注意:编译posix mqueue时,要连接运行时库(runtime library),既-l