加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2013-09-14 21:10:01 所属栏目:Linux 来源:站长网
导读:一、在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列。 其实消息队列就是一个可 以让进程间交换数据的场所,而两个标准的消息队列最大
一、在前面介绍了system v 消息队列的相关知识,现在来稍微看看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

功能:删除消息队列

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读