Unix IPC之Posix消息队列(1)
部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html
IPC对象的持续性:http://book.51cto.com/art/201006/207275.htm
消息队列可以认为是一个消息链表,某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到,这一点与管道和FIFO相反。Posix消息队列与System V消息队列的区别如下:
1. 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任意指定优先级的消息。
2. 当往一个空队列放置一个消息时,Posix消息队列允许产生一个信号或启动一个线程,System V消息队列则不提供类似的机制。
Posix消息队列操作函数如下:
头文件及部分定义:
#include <mqueue.h> typedef int mqd_t;
/* Establish connection between a process and a message queue NAME and return message queue descriptor or (mqd_t) -1 on error. OFLAG determines the type of access used. If O_CREAT is on OFLAG, the third argument is taken as a `mode_t', the mode of the created message queue, and the fourth argument is taken as `struct mq_attr *', pointer to message queue attributes. If the fourth argument is NULL, default attributes are used. */ extern mqd_t mq_open (__const char *__name, int __oflag, ...) __THROW __nonnull ((1)); /* Removes the association between message queue descriptor MQDES and its message queue. */ extern int mq_close (mqd_t __mqdes) __THROW; /* Remove message queue named NAME. */ extern int mq_unlink (__const char *__name) __THROW __nonnull ((1));
下面采用上面的函数,写程序进程测试。
程序1(mqcreate1.c):创建一个消息队列,其名字是作为命令行参数指定。程序如下:
#include "unpipc.h" int main(int argc, char **argv) { int c, flags; mqd_t mqd; // linux下是int类型 flags = O_RDWR | O_CREAT; while ( (c = Getopt(argc, argv, "e")) != -1) { switch (c) { case 'e': flags |= O_EXCL; break; } } if (optind != argc - 1) err_quit("usage: mqcreate [ -e ] <name>"); mqd = Mq_open(argv[optind], flags, FILE_MODE, NULL); Mq_close(mqd); exit(0); }
程序2(mqunlink.c):删除一个消息队列。程序如下:
#include "unpipc.h" int main(int argc, char **argv) { if (argc != 2) err_quit("usage: mqunlink <name>"); Mq_unlink(argv[1]); exit(0); }