linux进程间通信的posix消息队列应用记录
一、头文件
需要包含系统头文件
mqueue.h
二、数据结构
struct mq_attr {
long mq_flags;
long mq_maxmsg;
long mq_msgsize;
long mq_curmsgs;
};
该数据结构配置消息队列参数,具体说明如下:
1、mq_flags
接收数据是否阻塞标志,0:阻塞;1:不阻塞;mq_open()这个接口忽略它,对于这个接口,这个参数可以配置,所以忽略该标志;
2、mq_maxmsg
队列中消息的最大数量;
3、mq_msgsize
单条消息的最大允许大小,以字节为单位
4、mq_curmsgs
当前队列中的的消息数量;mq_open()这个接口忽略它;
三、接口
1、打开消息队列
该功能提供两个接口,具体定义如下:
mqd_t mq_open(const char *name, int oflag);
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
参数定义如下:
name:消息队列的名称,注意,该名称中,只能有一个“/”,并且该队列,在系统中并不能显示;
oflag:可以是O_RDONLY,O_WRONLY,O_RDWR,也可以按位或O_CREATE,O_EXCL,O_NONBLOCK等标志;
mode:如果oflag指定了O_CREATE,需要设置mode,主要是相关的权限;
attr:如果oflag指定了O_CREATE,需要设置以下attr,否则会用系统默认,比如,系统默认mq_maxmsg为3,mq_msgsize为8192;
2、接收数据
该接口具体定义如下:
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
参数定义如下:
mqdes:消息队列描述符;
msg_ptr:接收消息存放的内存,该内存要大于消息队列中,每个消息的最大长度;
msg_len:接受消息的最大长度,该值要大于消息队列中,每个消息的最大长度,否则接收会一直报错;
msg_prio:接收到的消息的优先级,我暂时没有用到,我传输的消息的优先级是一样的;
3、发送数据
该接口具体定义如下:
mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);
参数定义如下:
mqdes:消息队列描述符;
msg_ptr:要发送的消息数据内存;
msg_len:要发送的消息数据的长度;
msg_prio:要发送的消息的优先级;
4、其他接口暂时没用,暂不记录;
四、注意事项
1、消息队列创建以后,该消息队列的参数已经固定,如果修改参数,只能重启系统,重新配置,才能生效;
2、在发送和接收数据的接口中,msg_ptr只是一片内存,不特指char字符串,可以是任意数据格式,可以是结构体、整形、浮点数等,使用该接口时,只要强转一下就可以了,但是要注意,数据长度是按字节的长度;