消息队列

一、函数

mq_open

头文件

mqueue.h;

原型

mqd_t mq_open(const char *name, int oflag, .../*mode_t mode,struct mq_attr* attr*/);

函数功能

创建消息队列;

参数

name:消息队列的名字,根据消息队列的规则,为了更好的可移植性,该名字必须以‘/’开头,创建一个消息队列的时候无须路径,给出名字就好,其存放位置可有自己指定(创建前后都可以)。

oflag:O_RDONLY(只读)O_WRONLY(只写)O_RDWR(可读可写)O_CREAT(创建)O_EXCL(当消息已存在时,返回EEXIST错误到errno中)O_NONBLOCK(设置非阻塞)

mode:在oflag中指定O_CREAT时,此参数是需要的。表示创建消息队列的权限,S_IRUSR,S_IWUSR,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IROTH,S_IWOTH,S_IXOTH相或组成或者写成0777(表示rwxrwxrwx)等用八进制表示也可以。

attr:在oflag中指定O_CREAT时,此参数是需要的。存放消息队列的属性。其中mq_flags为0,表示阻塞,为O_NONBLOCK为非阻塞。

(这里可以填写哪些参数具体看:二、Posix IPC)

返回值

若创建成功则返回消息队列的描述符,否则返回-1。

mq_close函数

头文件

mqueue.h

原型

int mq_close(mqd_t mqdes);

函数功能

关闭已打开的消息队列,关闭后调用进程不可以再使用该描述符,但其消息队列并没有被删除。一个进程终止时,它的所有打开着的消息队列都关闭,就像调用了mq_close一样。

参数

mqdes消息队列的描述符,即消息队列创建成功后的返回值。

返回值

成功返回0,失败返回-1。

mq_unlink

头文件

mqueue.h

原型

int mq_unlink(const char *name);

函数功能

从系统中删除名为name的消息队列,但删除的只是我们可以在系统中看见的文件的名字,但文件本身并没有被从磁盘上删除,除非该名称是文件的最后一个链接,并且该文件已关闭,才会将该文件真正从磁盘上删除。即如果某前该详细队列的文件还在其他进程中打开,那么不会将其从磁盘上删除,又或者这是最后一个链接,但它还为关闭,即未执行ma_close操作,或打开它的进程为结束就执行mq_unlink,它也不会从磁盘上删除。

参数

name消息队列的名称,以‘/’开始。

返回值

成功返回0,出错返回-1。

mq_getattr

头文件

mqueue.h

原型

int mq_getattr(mqd_t mqdes, struct mq_attr *attr);

函数功能

获取mqdes指的消息队列的属性,存放到attr结构体中。

struct mq_attr

{

long int mq_flags;    /* Message queue flags:0,O_NONBLOCK */

long int mq_maxmsg;   /* Maximum number of messages.  */

long int mq_msgsize;  /* Maximum message size.  */

long int mq_curmsgs;  /* Number of messages currently queued.  */

long int __pad[4];

};

参数

mqdes为消息队列描述符,attr为上面解释的存放消息队列属性的结构体。

返回值

成功返回0,失败返回-1。

mq_setattr

头文件

mqueue.h

原型

int mq_setattr(mqd_t mqdes, const struct mq_attr *attr,

struct mq_attr *oattr);

函数功能

设置消息队列的属性,但是只使用attr结构体中的mq_flags属性,以设置(O_NONBLOCK)或清除(0)非阻塞标志。该结构体的另外三个属性被忽略,每个队列的最大消息数和每个消息的最大字节数都只能在创建时设置,当前队列中的消息数是随传送消息和读取消息的操作改变的,只能读取不能设置。如果oattr非空,那么指定队列的先前属性(4个)全将返回到由该指针指向的结构体中。

参数

mqdes消息队列的属性

attr函数功能解释中

oattr函数功能解释中

返回值

成功返回0,失败返回-1。

mq_send

头文件

mqueue.h

原型

int mq_send(mqd_t mqdes, const char *ptr, size_t len,

unsigned int prio);

函数功能

给描述符mqdes指向的消息队列发送消息,大小为len,内容存放在ptr中,prio为优先级。

参数

mqdes为要发送消息的消息队列描述符;

ptr为要发送的数据;

len为消息的长度;

prio为消息的优先级;

返回值

成功返回0,失败返回-1。

mq_receive

头文件

mqueue.h

原型

ssize_t mq_receive(mqd_t mqdes, char *ptr, size_t len,

unsigned int *proip);

函数功能

从描述符mqdes指向的消息队列中读取消息存放ptr中。

参数

mqdes为要从中读取消息的消息队列的描述符;

ptr为存放接受到的消息的指针;

len为接受的最大长度;

该值不能小于能加到该消息对列上的最大大小,如果len小于该值,就立即返回EMSGSIZE错误。

返回值

成功返回读取消息的内容的字节数,出错返回-1。

mq_notify

头文件

mqueue.h;

signal.h;

原型

int mq_notify(mqd_t mqdes, const struct sigevent *notification);

函数功能

为指定队列建立或删除异步事件通知。

参数

在中:

typedef union sigval {

int sival_int;

void __user *sival_ptr;

} sigval_t;

typedef struct sigevent {

sigval_t sigev_value;

int sigev_signo;

int sigev_notify;

void  (*sigev_notify_function)(union sigval);

Pthread_attr_t *sigev_notify_attributes;

} sigevent_t;

(1).如果notification参数非空,那么当前进程希望在有一个消息到达所指定的先前为空的队列时得到通知。我们说“该进程被注册为接收该队列的通知”。

(2).如果notification参数为空指针,而且当前进程目前被注册为接收所指定队列的通知,那么已存在的注册将被撤销。

(3).任意时刻只有一个进程可以被注册为接收某个指定队列的通知。

(4).当有一个消息到达某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有在没有任何线程阻塞在该队列的mq_receive调用中的前提下,通知才会发出。这就是说,在mq_receive调用中的阻塞比任何通知的注册都优先。

(5).当该通知被发送给它的注册进程时,其注册即被撤销。该进程必须再次调用mq_notify重新注册(如果想要的话)。

返回值

成功返回0,失败返回-1。

二、程序举例

mqsend.c

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

mqd_t mqd;

char *ptr;

size_t len;

unsigned int prio;

if(argc != 4)

perror("./mqsend mqueue_name size prio!\n");

len = atoi(argv[2]);

prio = atoi(argv[3]);

mqd = mq_open(argv[1], O_WRONLY);

ptr = (char *)calloc(len, sizeof(char));

strcpy(ptr, "wjj_xyd");

mq_send(mqd, ptr, len, prio);

exit(0);

}

mqreceive.c

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

int c, flags;

mqd_t mqd;

ssize_t n;

unsigned int prio;

char *buff;

struct mq_attr attr;

flags = O_RDONLY;

while((c = getopt(argc,argv, "n")) != -1)

{

switch(c){

case ‘n‘:flags |= O_NONBLOCK;

break;

}

}

if(optind != argc - 1)

perror("mqreceive error!\n");

mqd = mq_open(argv[optind], flags);

mq_getattr(mqd, &attr);

buff = (char*)malloc(attr.mq_msgsize);

n = mq_receive(mqd, buff, attr.mq_msgsize, &prio);

printf("buff = %s, read %ld bytes, priority = %u\n",buff, (long)n, prio);

exit(0);

}

原文:http://www.cnblogs.com/jiangzhaowei/p/4109404.html

linux 消息队列大小设置,linux 消息队列 参数相关推荐

  1. linux 文件缓存大小设置,Linux文件读写机制及优化方式

    导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...

  2. dl388g7 驱动 linux,HPDL388G7做OLIRAIDBIOS设置linux安装概要.doc-资源下载在线文库www.lddoc.cn...

    HP DL388 G7做OLIRAIDBIOS设置linux安装概要.doc Hp ilo配置开机怎么进的 第一个界面按any 然后还没出现阵列卡信息的时候赶紧按F8 我就是这样进去的 不知道有没有什 ...

  3. linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改

    Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...

  4. linux查看block大小命令,Linux/Centos下多种方法查看系统block size大小

    例如: tune2fs -l /dev/hda1 |grep "Block size" Block size:               4096 另一个工具dumpe2fs也可 ...

  5. 如何设置linux lang环境变量,设置linux环境变量LANG(示例代码)

    export LANG="zh_cn.gb118030" 一般来说要设置 Linux 系统的环境变量只需要在 /etc/profile (全局) 或者 ~/.bashrc (单个用 ...

  6. linux熄屏时间设置,linux xset 关闭屏幕保护-关闭节电模式

    由于工作较忙,随性更新.admin@stgod.com linux机器运行一个监控程序,需要显示器一直亮着,不能黑屏,不能进入省电模式. 系统中没有安装gnome的电源管理程序,也没有安装屏幕保护程序 ...

  7. linux+dhcp+租约时间设置,Linux DHCP设置

    Linux DHCP服务端设置 首先要安装DHCP,如yum install dhcp 安装好了后所有的DHCP配置文件是放在/etc/dhcp/目录中,dhcpd.conf是主配置文件.刚装好DHC ...

  8. linux 任务计划 权限设置,Linux系统 文件权限+计划任务+日志系统

    实验目的:熟练掌握权限相关概念和具体操作 实验环境:Red Hat Enterprise Linux Server 5.3 实验步骤: 一.文件权限 二.计划任务 三.日志 一.文件权限 (一)基本权 ...

  9. linux系统core dump设置,linux coredump设置

    1. core 在Linux下程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息,编译时需要加上 -g -Wall). 使用gdb来查看core文件,可以指 ...

  10. linux安装磁盘分区设置,Linux安装与磁盘分区.doc

    关于Linux系统下的"分区"问题,对于新手来说一直是很头疼的.我来简单写一下,它的"分区"方法,规则.郑重声明:1.我为了让没有接触过Linux系统的人,理解 ...

最新文章

  1. 绿色运营,数据中心还得靠自动化
  2. 开源项目管理工具禅道ZenTaoPMS发布0.6 beta版本
  3. 剑指offer 变态跳台阶
  4. dict过滤 python_小猿圈解析Python开发的技巧都有哪些?
  5. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
  6. Oracle学习之路-- 案例分析实现行列转换的几种方式
  7. 常用日期格式符(表格)
  8. 【解题报告】Jury Meeting (9.8CF div2)
  9. Android app 页面加载统计工具
  10. “黑盒工坊”,轻松管理《魔兽世界》插件!
  11. css基础-属性值计算过程
  12. 三菱PLC中通过变址寄存器V或Z实现简单跑马灯的程序示例及说明
  13. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML
  14. 高级建模方法(Gurobi):线性化、分段线性函数、逻辑变量/约束
  15. 项目管理之 项目阶段划分
  16. 内网渗透_信息搜集(Linux)
  17. 计算机无法识别读卡器怎么办,在win7电脑中识别不了读卡器的解决方法介绍
  18. 易知微入选「2022爱分析·低代码厂商全景报告」|共创数字孪生未来
  19. 如何设置电脑减少服务器响应时间,win7电脑如何缩短系统响应时间?
  20. MediaPlayer的使用

热门文章

  1. 敏捷开发模式下的BA岗
  2. DDR4 vs LPDDR4 vs LPDDR4x:有什么区别?
  3. ddr3ddr4 lpddr4速率_LPDDR4和LPDDR3性能差别多少 LPDDR4和LPDDR3参数对比
  4. 谷歌AI新进展!将静态照片生成3D动图;代码翻译与代码生成工具;C/Java/Python多种语言项目实战教程大汇总;开源知识社区软件;前沿论文 | ShowMeAI资讯日报
  5. 【5G学习笔记-8】38.306 36.306 User Equipment (UE) radio access capabilities 以及终端CDRX能力上报 featureGroupIndic
  6. CAN协议学习(一)
  7. JS实现继承的几种方式
  8. excel切片器_干货分享:Excel数据透视表操作技巧,帮你提升工作效率
  9. SSO单点登录系统解决方案
  10. python itchat_Python itchat模块在微信上的