struct mq_attr
{
long mq_flags; /* message queue flag : 0, O_NONBLOCK */
long mq_maxmsg; /* max number of messages allowed on queue*/
long mq_msgsize; /* max size of a message (in bytes)*/
long mq_curmsgs; /* number of messages currently on queue */
}; /* Receive the oldest from highest priority messages in message queue
MQDES. */
ssize_t mq_receive (mqd_t __mqdes, char *__msg_ptr, size_t __msg_len,
unsigned int *__msg_prio); /* Add message pointed by MSG_PTR to message queue MQDES. */
int mq_send (mqd_t __mqdes, __const char *__msg_ptr, size_t __msg_len,
unsigned int __msg_prio);

程序1:向消息队列中发送消息。可指定消息大小及优先级。

// mqsend.c

#include    "unpipc.h"

int
main(int argc, char **argv)
{
mqd_t mqd;
void *ptr;
size_t len;
unsigned int prio; if (argc != )
err_quit("usage: mqsend <name> <#bytes> <priority>");
len = atoi(argv[]);
prio = atoi(argv[]); mqd = Mq_open(argv[], O_WRONLY); ptr = Calloc(len, sizeof(char)); // 使用calloc函数分配一个长度为len的缓冲区,默认被初始化为0
Mq_send(mqd, ptr, len, prio); // 写入消息队列 exit();
}

程序2:从消息队列读出消息。

// mqreveive.c

#include    "unpipc.h"

int
main(int argc, char **argv)
{
int c, flags;
mqd_t mqd;
ssize_t n;
unsigned int prio;
void *buff;
struct mq_attr attr; flags = O_RDONLY;
while ( (c = Getopt(argc, argv, "n")) != -)
{
switch (c)
{
case 'n': // 命令行中带-n表示以非阻塞模式
flags |= O_NONBLOCK;
break;
}
}
if (optind != argc - )
err_quit("usage: mqreceive [ -n ] <name>"); mqd = Mq_open(argv[optind], flags);
Mq_getattr(mqd, &attr);
// 这里开辟的缓冲区需要>=消息的最大长度,以便能够容纳接收到的消息
buff = Malloc(attr.mq_msgsize); // 根据最大消息的大小开辟缓冲区以接收消息 n = Mq_receive(mqd, buff, attr.mq_msgsize, &prio); // 这里的len长度需要>=消息的最大长度,否则mq_receive会立即返回EMSGSIZE错误
printf("read %ld bytes, priority = %u\n", (long) n, prio); exit();
}

运行结果:

[dell@localhost pxmsg]$ ls -l /tmp/mqueue/
总用量
[dell@localhost pxmsg]$ ./mqcreate1 /msgqueue
[dell@localhost pxmsg]$ ls -l /tmp/mqueue/
总用量 [dell@localhost pxmsg]$ sudo mount -t mqueue none /tmp/mqueue
[sudo] password for dell:
[dell@localhost pxmsg]$ ls -l /tmp/mqueue/
总用量
-rw-r--r--. dell dell 8月 : msgqueue [dell@localhost pxmsg]$ ./mqsend /msgqueue
[dell@localhost pxmsg]$ ./mqsend /msgqueue
[dell@localhost pxmsg]$ ./mqsend /msgqueue
[dell@localhost pxmsg]$ ls -l /tmp/mqueue/
总用量
-rw-r--r--. dell dell 8月 : msgqueue [dell@localhost pxmsg]$ ./mqreceive /msgqueue
read bytes, priority =
[dell@localhost pxmsg]$ ./mqreceive /msgqueue
read bytes, priority =
[dell@localhost pxmsg]$ ./mqreceive /msgqueue
read bytes, priority =
[dell@localhost pxmsg]$ ./mqreceive /msgqueue
^C
// 这里默认是阻塞方式,当消息队列为空时将会被阻塞,所以下面我们使用非阻塞方式。
[dell@localhost pxmsg]$ ./mqreceive -n /msgqueue
mq_receive error: Resource temporarily unavailable
[dell@localhost pxmsg]$

Unix IPC之Posix消息队列(3)的更多相关文章

  1. Unix IPC之Posix消息队列(1)

    部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...

  2. Unix IPC之Posix消息队列(2)

    /* Query status and attributes of message queue MQDES. */ extern int mq_getattr (mqd_t __mqdes, stru ...

  3. IPC通信:Posix消息队列

    IPC通信:Posix消息队列 消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息. ...

  4. UNIX IPC: POSIX 消息队列 与 信号

    POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include < ...

  5. UNIX IPC: POSIX 消息队列

    首先在我的MAC OSX上试了一下虽然有_POSIX_MESSAGE_PASSING的宏定义,但是用gcc编译会提示没有mqueue.h头文件,先放一边.在Ubuntu上使用正常,不过POSIX消息队 ...

  6. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  7. Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

    posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...

  8. Linux IPC POSIX 消息队列

    模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...

  9. Linux环境编程之IPC进程间通信(五):Posix消息队列1

    对于管道和FIFO来说.必须应该先有读取者存在.否则先有写入者是没有意义的. 而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每一个 ...

随机推荐

  1. hdu 6311 欧拉回路

    题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...

  2. WEB下面路径的问题

    web 中的  /  到底代表什么? 绝对路径-以Web站点根目录为参考基础的目录路径.之所以称为绝对,意指当所有网页引用同一个文件时,所使用的路径都是一样的.相对路径-以引用文件之网页所在位置为参考 ...

  3. Docker swarm 使用服务编排部署lnmp

    一.简介 目的:在Docker Swarm集群中,使用stack服务编排搭建lnmp来部署WordPress 使用私有仓库的nginx和php镜像 mysql使用dockerhup最新镜像 使用nfs ...

  4. 进化论VS中性突变理论

    进化论VS中性突变理论 查尔斯·罗伯特·达尔文(英语:CharlesRobert Darwin,1809年2月12日-1882年4月19日),英国生物学家,其“进化论”被列为19世纪自然科学的三大发现 ...

  5. PHP判断变量类型和类型转换的三种方式

    前言: PHP 在变量定义中不需要(不支持)明确的类型定义.变量类型是根据使用该变量的上下文所决定的.所以,在面对页码跳转.数值计算等严格的格式需求时,就要对变量进行类型转换. 举例如下: $foo ...

  6. Ubuntu下配置支持Windows访问的Samba共享

    一.安装Ubuntu samba服务器 $ sudo apt-get install samba $ sudo apt-get install smbclient # Linux客户端测试用 二.创建 ...

  7. 3.fIddler的使用

    https://blog.csdn.net/chaoyu168/article/details/51065644 https://blog.csdn.net/u013474436/article/de ...

  8. excel sum求和遇到的问题及解决

    在偶遇的,借助excel公式sum对一个数字数组进行求和,结果为0,很是诧异,当然原因就是,数组里的数字是“常规”格式,不是“数值”格式,由于系统生成的excel,不方便生成的同时再做格式的设置,于是 ...

  9. Redis学习七:Redis的持久化-总结(Which one)

    1.官网建议 2.RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储 3.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些 命令来恢复原始的数据,AOF命令以red ...

  10. zedboard 初使用 -- 工具篇

    <一> 安装ISE和Vivada: <二> 安装USB转UART驱动 <三> 安装USB转JTAG驱动插件 http://blog.sina.com.cn/s/bl ...