消息队列能够认为是一个消息链表。进程(线程)能够往里写消息,也能够从里面取出消息。shell
前面讲到的管道和FIFO在写入消息时必须有进程读,不然是一直阻塞的。而消息队列则不一样,一个进程能够往某个消息队列里写消息,而后终止,另外一个进程随时能够从消息队列里取走这些消息。这里也说明了,消息队列具备随内核的持续性,也就是系统不重启,消息队列永久存在。编程
#include <mqueue.h> /* 函数说明:函数建立或打开一个消息队列 返回值:成功返回消息队列描述符,失败返回-1,错误缘由存于errno中 */ mqd_t mq_open(const char *name, int oflag, .../* mode_t mode, struct mq_attr *attr */); /* 函数说明:关闭一个打开的消息队列,表示本进程再也不对该消息队列读写 返回值:成功返回0,失败返回-1,错误缘由存于errno中 */ int mq_close(mqd_t mqdes); /* 函数说明:删除一个消息队列,比如删除一个文件,其余进程再也没法访问 返回值:成功返回0,失败返回-1,错误缘由存于errno中 */ int mq_unlink(const char *name);
下面经过程序看一下如何建立(并打开)、关闭、删除一个消息队列。
#include <stdio.h> #include <stdlib.h> #include <mqueue.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #define MQ_NAME ("/tmp") #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 建立MQ的flag #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定建立MQ的权限 int main() { mqd_t posixmq; int rc = 0; posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL); if(-1 == posixmq) { perror("建立MQ失败"); exit(1); } rc = mq_close(posixmq); if(0 != rc) { perror("关闭失败"); exit(1); } rc = mq_unlink(MQ_NAME); if(0 != rc) { perror("删除失败"); exit(1); } return 0; }
编译并执行:网络
[infor@s123 PosixMq]$ gcc -o createmq createmq.c -lrt [infor@s123 PosixMq]$ ./createmq
编译这个程序须要注意几点:函数
一、由于mq_XXX()函数不是标准库函数,连接时须要指定;库-lrt;
二、消息队列的名字最好使用“/”打头,而且只有一个“/”的名字。不然可能出现移植性问题;(还需保证在根目录有写权限)
三、建立成功的消息队列不必定能看到,(使用一些方法也能够看到,本文不作介绍);spa