linux网络编程之POSIX 消息队列 和 系列函数

本文介绍了Linux中POSIX消息队列的特性,包括消息队列的限制,如最大消息数量和长度。重点讲解了POSIX消息队列与System V消息队列API的区别,并展示了如何使用mq_open、mq_close、mq_unlink、mq_getattr、mq_setattr、mq_send、mq_receive和mq_notify等系列函数进行操作。通过示例程序说明了消息队列的通知机制和使用注意事项。
摘要由CSDN通过智能技术生成

一、在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列。

posix消息队列的一个可能实现如下图:


其实消息队列就是一个可以让进程间交换数据的场所,而两个标准的消息队列最大的不同可能只是api 函数的不同,如system v 的系列函数是msgxxx,而posix 是mq_xxx。posix 消息队列也有一些对消息长度等的限制,man 7 mq_overview:

simba@ubuntu:~/Documents/code/linux_programming/UNP/posix$ cat /proc/sys/fs/mqueue/msg_max 
10
simba@ubuntu:~/Documents/code/linux_programming/UNP/posix$ cat /proc/sys/fs/mqueue/msgsize_max 
8192
simba@ubuntu:~/Documents/code/linux_programming/UNP/posix$ cat /proc/sys/fs/mqueue/queues_max 
256

即一个消息队列最多能有10条消息,每条消息的最大长度为8192字节,一个系统最多能有256个消息队列。

还有一点是,在Linux上,posix 消息队列是以虚拟文件系统实现的,必须将其挂载到某个目录才能看见,如


           # mkdir /dev/mqueue
           # mount -t mqueue none /dev/mqueue

通过cat 命令查看消息队列的状态,假设mymq 是创建的一条消息队列的名字
           $ cat /dev/mqueue/mymq
           QSIZE:129     NOTIFY:2    SIGNO:0    NOTIFY_PID:8260

QSIZE:消息队列所有消息的数据长度

NOTIFY_PID:某个进程使用mq_notify 注册了消息到达异步通知事件,即此进程的pid

NOTIFY:通知方式: 0 is SIGEV_SIGNAL; 1 is SIGEV_NONE; and 2 is SIGEV_THREAD.

SIGNO:当以信号方式通知的时候,表示信号的编号.


二、系列函数,编译时候加上 -lrt 选项,即连接librt 库 (实时库)

      #include <fcntl.h>           /* For O_* constants */
      #include <sys/stat.h>        /* For mode constants */
      #include <mqueue.h>

功能:用来创建和访问一个消息队列
原型
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: 某个消息队列的名字,必须以/打头,并且后续不能有其它/ ,形如/somename长度不能超过NAME_MAX(255)
oflag:与open函数类似,可以是O_RDONLY、O_WRONLY、O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_NONBLOCK;
mode:如果oflag指定了O_CREAT,需要设置mode。
返回值:成功返回消息队列文件描述符;失败返回-1


功能:关闭消息队列
原型
mqd_t mq_close(mqd_t mqdes);
参数
mqdes : 消息队列描述符
返回值:成功返回0;失败返回-1


功能:删除消息队列
原型
mqd_t mq_unlink(const char *name);
参数
name: 消息队列的名字
返回值:成功返回0;失败返回-1


功能:获取/设置消息队列属性
原型
mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);
mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr);
返回值:成功返回0;失败返回-1

           struct mq_attr {
               long mq_flags;       /* Flags: 0 or O_NONBLOCK */
               long mq_maxmsg;      /* Max. # of messages on queue */ 
               long mq_msgsize;     /* Max. message size (bytes) */
               long mq_curmsgs;     /* # of messages currently in queue */
           };

mq_flags 是标志;mq_maxmsg 即一个消息队列消息个数上限;mq_msgsize即一条消息的数据上限;mq_curmsgs即当前消息个数


功能:发送消息
原型
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:消息优先级
返回值:成功返回0;失败返回-1


功能:接收消息
原型
ssize_t mq_receive(mqd_t mq

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值