Posix在线文档:
Linux系统中提供了两种不同接口的消息队列:
- POSIX消息队列。POSIX为可移植的操作系统接口。
- System V消息队列。System V 是 AT&T 的第一个商业UNIX版本(UNIX System III)的加强。
其中,POSIX消息队列可移植性较强,使用较广。
Linux系统中提供的消息队列一般应用于进行间通信,但也可以用于线程间通信。
本文介绍POSIX消息队列应用于线程间通信。
相关API
Linux内核提供了一系列函数来使用消息队列:
/** * @brief 创建消息队列实例 * * Detailed function description * * @param[in] name: 消息队列名称 * @param[in] oflag:根据传入标识来创建或者打开一个已创建的消息队列 - O_CREAT: 创建一个消息队列 - O_EXCL: 检查消息队列是否存在,一般与O_CREAT一起使用 - O_CREAT|O_EXCL: 消息队列不存在则创建,已存在返回NULL - O_NONBLOCK: 非阻塞模式打开,消息队列不存在返回NULL - O_RDONLY: 只读模式打开 - O_WRONLY: 只写模式打开 - O_RDWR: 读写模式打开 * @param[in] mode:访问权限 * @param[in] attr:消息队列属性地址 * * @return 成功返回消息队列描述符,失败返回-1,错误码存于error中 */ mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr); /** * @brief 无限阻塞方式接收消息 * * Detailed function description * * @param[in] mqdes: 消息队列描述符 * @param[in] msg_ptr:消息体缓冲区地址 * @param[in] msg_len:消息体长度,长度必须大于等于消息属性设定的最大值 * @param[in] msg_prio:消息优先级 * * @return 成功返回消息长度,失败返回-1,错误码存于error中 */ mqd_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); /** * @brief 指定超时时间阻塞方式接收消息 * * Detailed function description * * @param[in] mqdes: 消息队列描述符 * @param[in] msg_ptr:消息体缓冲区地址 * @param[in] msg_len:消息体长度,长度必须大于等于消息属性设定的最大值 * @param[in] msg_prio:消息优先级 * @param[in] abs_timeout:超时时间 * * @return 成功返回消息长度,失败返回-1,错误码存于error中 */ mqd_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); /** * @brief 无限阻塞方式发送消息 * * Detailed function description * * @param[in] mqdes: 消息队列描述符 * @param[in] msg_ptr:待发送消息体缓冲区地址 * @param[in] msg_len:消息体长度 * @param[in] msg_prio:消息优先级 * * @return 成功返回0,失败返回-1 */ mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio); /** * @brief 指定超时时间阻塞方式发送消息 * * Detailed function description * * @param[in] mqdes: 消息队列描述符 * @param[in] msg_ptr:待发送消息体缓冲区地址 * @param[in] msg_len:消息体长度 * @param[in] msg_prio:消息优先级 * @param[in] abs_timeout:超时时间 * * @return 成功返回0,失败返回-1 */ mqd_t mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); /** * @brief 关闭消息队列 * * Detailed function description * * @param[in] mqdes: 消息队列描述符 * * @return 成功返回0,失败返回-1 */ mqd_t mq_close(mqd_t mqdes); /** * @brief 分离消息队列 * * Detailed function description * * @param[in] name: 消息队列名称 * * @return 成功返回0,失败返回-1 */ mqd_t mq_unlink(const char *name);
消息队列的名称类似于设备文件,mq_open通过名称打开对应的消息队列,然后返回一个消息队列描述符,之后的操作都是引用返回的描述符,类似于打开文件时返回的文件描述符。
其实和文件的打开、读写、关闭都非常类似。
POSIX消息队列允许进程以消息的形式交换数据。 消息队列是使用mq_open创建和打开的;此函数返回消息队列描述符(mqd_t),该描述符用于在以后的调用中引用打开的消息队列。每个消息队列由/somename形式的名称标识,该名称由一个初始斜杠组成,后跟一个或多个字符(都不是斜杠)。通过将相同的名称传递给mq_open,两个进程可以在同一队列上进行操作。 使用mq_send和mq_receive在队列之间来回传送消息。当进程使用完队列后