UNIX IPC: POSIX 消息队列
首先在我的MAC OSX上试了一下虽然有_POSIX_MESSAGE_PASSING的宏定义,但是用gcc编译会提示没有mqueue.h头文件,先放一边。在Ubuntu上使用正常,不过POSIX消息队列通过ipcs命令是看不到的,需要通过如下方式进行查看:
mount -t mqueue none /mnt
ls -al /mnt
ls列出的文件即为程序中创建的POSIX消息队列,消息队列的名称需要以“/”开头否则会提示参数非法。通过cat查看这个文件可以知道这个队列的一些参数如:
hgf@ubuntu:~/ipc$ cat /mnt/testmq QSIZE: NOTIFY: SIGNO: NOTIFY_PID:
编译代码时需要加上-lrt参数,即连接Posix.1 realtime库,
基本操作API
mqd_t mq_open(const char* name, int oflag, ... /* mode_t mode, struct mq_attr attr */); int mq_close(mqd_t mqdes); int mq_unlink(const char* name); int mq_getattr(mqd_t mqdes, struct mq_attr* attr); int mq_setattr(mqd_t mqdes, struct mq_attr* attr, struct mq_attr* oattr); int mq_send(mqd_t mqdes, const char* buf, size_t len, unsigned int prior); int mq_receive(mqd_t mqdes, const char* buf, size_t len, unsigned int* priop);
mqcreate.c (gcc mqcreate.c -lrt -o mqcreate)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <unistd.h>
#include <getopt.h> struct mq_attr attr; int main(int argc, char** argv) {
char opt; char* MQ_NAME = "/testmq"; int OPEN_MODE = O_RDWR | O_CREAT;
int FILE_MODE = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; while((opt = getopt(argc, argv, "en:m:z:")) != -) {
switch(opt) {
case 'e':
OPEN_MODE |= O_EXCL;
break;
case 'm':
attr.mq_maxmsg = atol(optarg);
break;
case 'z':
attr.mq_msgsize = atol(optarg);
break;
case 'n':
MQ_NAME = optarg;
break;
}
} printf("msg queue name:%s\nmsg max size: %ld\nmsg per size: %ld\n",
MQ_NAME, attr.mq_maxmsg, attr.mq_msgsize); struct mq_attr* attrarg = NULL;
if (attr.mq_maxmsg != ) {
attrarg = &attr;
} mqd_t mq = mq_open(MQ_NAME, OPEN_MODE, FILE_MODE, attrarg); if (mq < ) {
perror("message queue create failed:");
return ;
} return ;
}
mqunlink.c (gcc mqunlink.c -lrt -o mqunlink)
#include <stdio.h>
#include <stdlib.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h> int main(int argc, char** argv) {
char* MQ_NAME = "/testmq"; if (argc > ) {
MQ_NAME = argv[];
} int res = mq_unlink(MQ_NAME); if (res < ) {
perror("close message queue:");
} return ;
}
mqgetattr.c
#include <stdio.h>
#include <stdlib.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h> int main(int argc, char** argv) {
char* name = "/testmq"; if (argc > ) {
name = argv[];
} mqd_t mq = mq_open(name, O_RDONLY); if (mq < ) {
perror("open message queue failed:");
return ;
} struct mq_attr attr; mq_getattr(mq, &attr); printf("max #msgs = %ld, max #bytes/msg = %ld, #current = %ld\n",
attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs
); int res = mq_close(mq); if (res != ) {
perror("close message queue failed:");
}
return ;
}
mqsend.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h> int main(int argc, char** argv) {
mqd_t mqd;
void *ptr;
size_t len;
unsigned int prio; if (argc != ) {
printf("%s msg_queue_name message priority\n", argv[]);
return -;
} mqd = mq_open(argv[], O_WRONLY); if (mqd < ) {
perror("open message queue failed");
return -;
} len = strlen(argv[]) + ; ptr = malloc(len); prio= atoi(argv[]); strcpy(ptr, argv[]); int res = mq_send(mqd, ptr, len, prio); if (res != ) {
perror("send msg faild");
return -;
} return ;
}
mqreceive.c
#include <stdio.h>
#include <stdlib.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <getopt.h> int main(int argc, char** argv) { char opt; char* queue = "/testmq"; int FILE_MODE = O_RDONLY; while ((opt = getopt(argc, argv, "xn:")) != -) {
switch (opt) {
case 'n':
queue = optarg;
break;
case 'b':
FILE_MODE |= O_NONBLOCK;
break;
}
} mqd_t mqd = mq_open(queue, FILE_MODE); if (mqd < ) {
perror("open message queue failed");
return -;
} struct mq_attr attr;
char* buffer = NULL;
int prio; mq_getattr(mqd, &attr);
buffer = malloc(attr.mq_msgsize + ); for(;;) {
int res = mq_receive(mqd, buffer, attr.mq_msgsize, &prio);
if (res < ) {
perror("read msg fail");
return;
} printf("read msg size:%u, msg(%s), prio:%d\n", res, buffer, prio);
if (FILE_MODE & O_NONBLOCK) {
sleep();
printf(".");
}
}
return ;
}
UNIX IPC: POSIX 消息队列的更多相关文章
- UNIX IPC: POSIX 消息队列 与 信号
POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include < ...
- Linux IPC POSIX 消息队列
模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...
- Unix IPC之Posix消息队列(1)
部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...
- IPC通信:Posix消息队列
IPC通信:Posix消息队列 消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息. ...
- Linux IPC实践(7) --Posix消息队列
1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...
- Linux环境编程之IPC进程间通信(五):Posix消息队列1
对于管道和FIFO来说.必须应该先有读取者存在.否则先有写入者是没有意义的. 而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每一个 ...
- 进程间通信--POSIX消息队列
相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...
- [转]Linux进程通信之POSIX消息队列
进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...
随机推荐
- 【docker】docker下安装mysql
1 拉取mysql镜像,采用网易加速地址docker pull hub.c.163.com/library/mysql:5.7 2 重命名镜像名docker tag hub.c.163.com/lib ...
- iOS ---进阶之摇一摇
1.摇一摇的原理分析 1)在摇动手机时会产生一个动画,界面的图片会在中间分开分别进行向上.向下的位置移动. 分析:此过程就是在主屏幕上设置两个imageView,在开始摇动的方法中对这两个imageV ...
- servlet,listener,filter,interceptor的关系
1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术 ...
- dubbo学习笔记:快速搭建
搭建一个简单的dubbo服务 参考地址: dubbo官网:http://dubbo.apache.org/zh-cn/docs/user/references/registry/zookeeper.h ...
- 论文分享NO.4(by_xiaojian)
论文分享第四期-2019.04.16 Residual Attention Network for Image Classification,CVPR 2017,RAN 核心:将注意力机制与ResNe ...
- 【Three.js】模型抗锯齿处理
1.锯齿消除方法 three.js参考使用官方demo发现模型渲染有锯齿,这种情况在旋转视角时候就非常明显. 抗锯齿的方法,很简单,只需要配置render两个属性即可: renderer = new ...
- 2019.04.18 第六次训练 【2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage】
题目链接: https://codeforces.com/gym/101911 又补了set的一个知识点,erase(it)之后it这个地址就不存在了,再引用的话就会RE A: ✅ B: ✅ C: ...
- DB2 命令大全
check Archiving processing 查看日志归档情况 db2 "SELECT DATE(CAST(START_TIME as TIMESTAMP)) as DATE, co ...
- java容器类1:Collection,List,ArrayList,LinkedList深入解读
1. Iterable 与 Iterator Iterable 是个接口,实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符 ...
- ZendStudio操作技巧
1.恢复窗口默认布局 点开菜单栏上的“windows”,出来的菜单中有个“Reset Perspective...”,点这个就行了