Posix消息队列相关函数
Posix消息队列(message queue)
IPC函数中常用的参数取值:
打开或创建POSIX IPC对象所用的各种oflag常值
o_RDONLY 只读
O_WRONLY 只写
O_RDWD 读写
O_CREAT 若不存在则创建,存在则引用
O_EXCL 排他性创建,需要和O_CREAT一起使用,当对象不存在时才创建,否则返回EEXIST错误
O_NONBLOCK 非阻塞模式
O_TRUNC 若已存在则截短
创建新的IPC对象所用的mode常值:
S_IRUSR 用户(属主)读
S_IWUSR 用户(属主)写
S_IRGRP 属组读
S_IWGRP 属组写
S_IROTH 其他用户读
S_IWOTH 其他用户写
mq_open()函数:
#include <mqueue.h> // 创建一个新的消息队列,或打开一个已存在的消息队列
// 成功返回消息队列描述符,出错 返回-1
mqd_t mq_open(const char *name, int oflag, ...
/* mode_t mode, struct mq_attr *attr */);
// name:Posix IPC名字(标识符)
// oflag取值: o_RDONLY、O_WRONLY、O_RDWD,可能按位或上O_CREAT、O_EXCL、O_NONBLOCK
// attr: 消息队列的属性(可以不指定此参数)
mq_close()函数:
#include <mqueue.h> // 关闭一个打开着的消息队列,但不从系统中将其删除,成功返回0,出错返回-1
int mq_close(mqd_t mqdes);
mq_unlink()函数:
#include <mqueue.h> // 从系统中删除一个消息队列,成功返回0,出错返回-1
int mq_unlink(const char *pathname);
注意:
大家可能在close和unlink之间存在疑惑,而除了此处的close和unlink,还有对文件的close和unlink
面对不同对象的close和unlink,表示的含义其实是相同的,close(关闭)即关闭open打开的对某个对
象的访问通道,而对于对象本身存在与否(创建/删除)没有影响,而unlink影响的是某个对象是否存在
一旦对某个对象的链接数(link)为0,且该对象没有被open,则该对象就会被彻底删除
上述的对象(File、Message Queue...等)
消息队列的属性:
struct mq_attr{
long mq_flags; // 消息队列的标志
long mq_maxmsg; // 队列允许的最大消息数量
long mq_msgsize; // 消息的最大长度(bytes)
long mq_curmsgs; // 此时存在与队列中的消息数量
};
mq_getattr()和mq_setattr()函数:
#include <mqueue.h> // 成功返回0,出错返回-1
// 将当前消息队列的属性填入参数attr指向的结构中
int mq_getattr(mqd_t mqdes, struct mq_attr *attr); // 给指定队列设置属性(attr,但只使用attr的attr.mq_flags成员),当oattr非空时,将指定队列的先前属性填入其中
int mq_setattr(mqd_t mqdes, const struct mq_attr *attr, struct mq_attr *oattr);
mq_send()和mq_receive()函数:
#include <mqueue.h> // 成功返回0,出错返回-1
// 往消息队列中放置一个消息
int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);
// prio: 待发消息的优先级 // 成功返回消息的字节数,出错返回-1
// 从消息队列取出一个消息
ssize_t mq_receive(mqd_t mqdes, const char *ptr, size_t len, unsigned int *priop);
// 这里的len参数值不能小于能添加到指定队列中消息的最大大小(mq_attr.mq_msgsize)
mq_notify()函数:
#include <mqueue.h> // 成功返回0,出错返回-1
// 指定队列建立或删除异步事件通知
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
相关结构:
union sigval{
int sival_int;
void *sival_ptr;
};
struct sigevent{
int sigev_notify;
int sigev_signo;
union sigval sigev_value;
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};
Posix消息队列相关函数的更多相关文章
- 第三十四章 POSIX消息队列
POSIX消息队列相关函数 mq_open 功能: 用来创建和访问一个消息队列 原型: mqd_t mq_open(const char *name, int oflag); //只能用来打开消息队列 ...
- 进程间通信--POSIX消息队列
相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...
- Linux IPC POSIX 消息队列
模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...
- Posix消息队列
转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...
- 第5章 Posix 消息队列
5.1 概述 消息队列可以认为是一个链表.有写权限的线程可往消息队列中放置消息,有读权限的线程可以从消息队列中取走消息. 消息队列和管道/FIFO的区别: (1)消息队列往一个队列中写消息前,并不需要 ...
- posix 消息队列
注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...
- Posix消息队列实现机制
本文是对<Unix 网络编程 卷2:进程通信>的笔记. 引言 消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来 ...
- POSIX 消息队列相关问题
一.查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除 ...
- Linux IPC实践(7) --Posix消息队列
1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...
随机推荐
- docker+Battery Historian 环境搭建(电量分析)
docker 安装(windows) 1. 下载 https://docs.docker.com/docker-for-windows/install/ 和 安装和添加环境变量(...) 2. 安 ...
- server 08 R2 NBL 报错:RPC 服务器在指定计算机上不可用
排查步骤如下: 1.检查并确保 Remote Procedure Call (RPC) 和 Remote Procedure Call (RPC) Locator这两项服务是否都已经启动 2.确认此2 ...
- luogu1640 [SCOI2010]连续攻击游戏
二分图匹配,一边是属性值,一边是武器 #include <iostream> #include <cstring> #include <cstdio> using ...
- 紫书第五章训练2 F - Compound Words
F - Compound Words You are to find all the two-word compound words in a dictionary. A two-word compo ...
- 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组
题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...
- Codeforces Round #345 (Div. 2) E. Table Compression(并查集)
传送门 首先先从小到大排序,如果没有重复的元素,直接一个一个往上填即可,每一个数就等于当前行和列的最大值 + 1 如果某一行或列上有重复的元素,就用并查集把他们连起来,很(不)显然,处于同一行或列的相 ...
- 【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)
题意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多组询问求f[n]对2147493647取模 N,a,b < 2^31 思路:重点在于i^4的 ...
- *Codeforces963C. Cutting Rectangle
$n \leq 200000$种互不相同的矩形,给长宽和数量,都$\leq 1e12$,问有多少种大矩形只沿平行长和宽切正好切成这些矩形. 首先可以发现在一个合法情况下,有些矩形的位置是可以乱挪的,比 ...
- 在 IntelliJ IDEA 中为自己设计的类库生成 JavaDoc
因为某个项目需要,为团队其他兄弟姐妹开发了一个 XML 分析处理器,并将其设计为一个类库,提供相应的 API 接口.为了方便大家的使用,需要生成对应的 JavaDoc 帮助文档,就像 JavaSE 标 ...
- (8)C#连sqlserver
str="Data Source=ip; Network Library=DBMSSOCN; Initial Catalog=数据库; User ID=sa; Password=xx&quo ...