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消息队列相关函数的更多相关文章

  1. 第三十四章 POSIX消息队列

    POSIX消息队列相关函数 mq_open 功能: 用来创建和访问一个消息队列 原型: mqd_t mq_open(const char *name, int oflag); //只能用来打开消息队列 ...

  2. 进程间通信--POSIX消息队列

    相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...

  3. Linux IPC POSIX 消息队列

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

  4. Posix消息队列

    转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...

  5. 第5章 Posix 消息队列

    5.1 概述 消息队列可以认为是一个链表.有写权限的线程可往消息队列中放置消息,有读权限的线程可以从消息队列中取走消息. 消息队列和管道/FIFO的区别: (1)消息队列往一个队列中写消息前,并不需要 ...

  6. posix 消息队列

    注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...

  7. Posix消息队列实现机制

    本文是对<Unix 网络编程 卷2:进程通信>的笔记. 引言 消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来 ...

  8. POSIX 消息队列相关问题

    一.查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除 ...

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

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

随机推荐

  1. luogu3396 哈希冲突

    参考这里 我们先预处理模数在 \(\sqrt{n}\) 以内的询问. 要是模数在 \(\sqrt{n}\) 以外,直接暴力统计,反正这样的数又不会超过 \(\sqrt{n}\) 个. 修改的时候也是. ...

  2. pytorch中torch.unsqueeze()函数与np.expand_dims()

    numpy.expand_dims(a, axis) Expand the shape of an array. Insert a new axis that will appear at the a ...

  3. MySQL主从复制报错一致性问题解决

    当MySQL主从复制中因为不一致报错的情况,我们第一时间想到的就是使用pt-table-checksum来进行检查主从一致并进行修复,但是使用此工具的前提是主从复制线程都为on状态, 所以这种情况下可 ...

  4. (转)iOS字体

    一.iOS原生字体展示 在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体.这些里面就有很炫的字体,但 是全部是只针对英文数字,对 ...

  5. Xcode的代码块和代码块注释

    我们看到的这些

  6. mac安装R语言启动后-Warning messages

    During startup - Warning messages: : Setting LC_CTYPE failed, using "C" : Setting LC_COLLA ...

  7. 【Luogu】P1850换教室(期望DP)

    题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...

  8. poj 1269 直线间的关系

    Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9360   Accepted: 421 ...

  9. C#.net的常用函数列表

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 1、DateTime 数字型 System.DateTime currentTime=new System.Dat ...

  10. 乱码及restful

    1.乱码的解决--通过过滤器来解决乱码:springmvc中提供CharacterEncodingFilter解决post乱码 <filter> <filter-name>Ch ...