【IPC通讯】Posix消息队列的建立

消息队列能够认为是一个消息链表。进程(线程)能够往里写消息,也能够从里面取出消息。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

至于为何消息队列的名字有如此规定,引用《UNIX网络编程 卷2》的相关描述:
mq_open,sem_open,shm_open这三个函数的第一个参数是一个IPC名字,它多是某个文件系统中的一个真正存在的路径名,也可能不是。Posix.1是这样描述Posix IPC名字的。
一、它必须符合已有的路径名规则(最多由PATH_MAX个字节构成,包括结尾的空字节)
二、若是它以斜杠开头,那么对这些函数的不一样调用将访问同一个队列,不然效果取决于实现(也就是效果没有标准化)
三、名字中的额外的斜杠符的解释由实现定义(一样是没有标准化)
所以,为便于移植起见,Posix IPC名字必须以一个斜杠打头,而且不能再包含任何其余斜杠符。

2011-11-14 任洪彩 qdurenhongcai@163.com
转载请注明出处。
相关文章
相关标签/搜索