msgsnd()函数

从函数名就可以看出,msgsnd()函数是用来向消息队列发送消息的。在linux/msg.h 它
的函数定义是这样的:
系统调用: msgsnd()
函数声明: int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )
返回值: 0 on success
-1 on error: errno = EAGAIN (queue is full, and IPC_NOWAIT was asserted)
EACCES (permission denied, no write permission)
EFAULT (msgp address isn't accessable – invalid)
EIDRM (The message queue has been removed)
EINTR (Received a signal while waiting to write)
EINVAL (Invalid message queue identifier, nonpositive
message type, or invalid message size)
ENOMEM (Not enough memory to copy message buffer)
传给msgsnd()函数的第一个参数msqid 是消息队列对象的标识符(由msgget()函数得
到),第二个参数msgp 指向要发送的消息所在的内存,第三个参数msgsz 是要发送信息的
长度(字节数),可以用以下的公式计算:
msgsz = sizeof(struct mymsgbuf) - sizeof(long);
第四个参数是控制函数行为的标志,可以取以下的值:
0,忽略标志位;
IPC_NOWAIT,如果消息队列已满,消息将不被写入队列,控制权返回调用函数的线
程。如果不指定这个参数,线程将被阻塞直到消息被可以被写入。
这里我们将创建一个封装函数来演示msgsnd()函数的使用:
int send_message( int qid, struct mymsgbuf *qbuf )
{
int result, length;
/* The length is essentially the size of the structure minus sizeof(mtype) */
length = sizeof(struct mymsgbuf) - sizeof(long);
if((result = msgsnd( qid, qbuf, length, 0)) == -1)
{
return(-1);
}
return(result);

msgrcv()函数

msgrcv()函数被用来从消息队列中取出消息。它在linux/msg.h
中的定义是这样的:
系统调用: msgrcv()
函数声明: int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, long
mtype,
int msgflg )
返回值: Number of bytes copied into message buffer
-1 on error: errno = E2BIG (Message length is greater than
msgsz,
no MSG_NOERROR)
EACCES (No read permission)
EFAULT (Address pointed to by msgp is
invalid)
EIDRM (Queue was removed during
retrieval)
EINTR (Interrupted by arriving signal)
EINVAL (msgqid invalid, or msgsz less than 0)
ENOMSG (IPC_NOWAIT asserted, and no
message
exists in the queue to satisfy the
request)
函数的前三个参数和msgsnd()函数中对应的参数的含义是相同的。第四个参数mtype
指定了函数从队列中所取的消息的类型。函数将从队列中搜索类型与之匹配的消息并将之
返回。不过这里有一个例外。如果mtype 的值是零的话,函数将不做类型检查而自动返回
队列中的最旧的消息。
第五个参数依然是是控制函数行为的标志,取值可以是:
0,表示忽略;
IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数
的进程。如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的
消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。如果进
程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。
MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,
剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被
取出。
当消息从队列内取出后,相应的消息就从队列中删除了。
我们将开发一个msgrcv()的封装函数read_message():
int read_message( int qid, long type, struct mymsgbuf *qbuf )
{
int result, length;
/* The length is essentially the size of the structure minus sizeof(mtype) */
length = sizeof(struct mymsgbuf) - sizeof(long);
if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
{
return(-1);
}
return(result);
}
利用上面提到的msgrcv()对消息长度的处理,我们可以使用下面的方法来检查队列内
是存在符合条件的信息:
int peek_message( int qid, long type )
{
int result, length;
if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT)) == -1)
{
if(errno == E2BIG)
return(TRUE);
}
return(FALSE);
}
这里我们将msgp 和msgsz 分别设为NULL 和零。然后检查函数的返回值,如果是E2BIG
则说明存在符合指定类型的消息。一个要注意的地方是IPC_NOWAIT 的使用,它防止了阻塞

msgsnd()函数 msgrcv()函数相关推荐

  1. msgsnd函数 msgrcv函数的一些小问题(IPC_NOWAIT慎用!)

    这两个函数别看它简单,真的是一不小心就会出错的啊 报错1:msgsnd: Invalid argument msgrcv: Argument list too long 这真的是一个最常见的错误了.. ...

  2. msgsnd/msgrcv函数祥解

    ================================ msgrcv()函数 ============================ msgrcv()函数被用来从消息队列中取出消息.它在l ...

  3. (P26)system v消息队列:msgsnd函数 ,msgrcv函数

    文章目录 1.msgsnd函数 2.msgrcv函数 1.msgsnd函数 功能:把一条消息添加到消息队列中原型:int msgsnd(int msqid, const void *msgp, siz ...

  4. 函数msgsnd()及函数msgrcv()参数详解

    最近看system V消息队列,在看到msgsnd()这个函数时,发现了一个错误.(注:我看的是UNIX网络编程卷二:进程间通信 第二版) msgsnd()函数:追加一条新消息到消息队列的系统调用语法 ...

  5. System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍

    System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...

  6. Java箭头函数,lambda函数

    Java箭头函数,lambda函数 lambda表达式实质就是一种语法糖,(建议尽量不要使用lambda表达式,代码太简洁,难懂,难以调试) lambda表达式的简单例子: 不需要参数,返回5 ()- ...

  7. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  8. python nums函数_Python函数

    一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...

  9. Python源码学习:Python函数浅析-函数闭包

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇分析了函数参数的分析后,本文分析函数闭包的实现.函数闭包即函数定义和函数表达式 ...

最新文章

  1. Android开发--Matrix(一)--实现图片的动态放大缩小
  2. .bak 服务器备份文件,如何从SQL Server Management Studio中的多个备份(bak)文件还原数据库...
  3. 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
  4. POJ3130(还是判断多边形的内核是否存在)
  5. 不借助Maven,使用Eclipse创建Hello World级别的Spring项目
  6. 支持向量机 - 从原理到算法的实现
  7. 5.FreeRTOS学习笔记- 互斥量
  8. SAP License:SAP中的日期
  9. python读取xml编码gb2312_【转】python XML 操作总结(创建、保存和删除,支持utf-8和gb2312)...
  10. 使用ApplicationContext类来完全封装闪屏功能
  11. TZOJ 数据结构期末历年题目
  12. Visio 画流程图 入门
  13. 如何快速出机械工程图
  14. atmega168p与328p_ATMEGA328P-MU产品说明
  15. vue3小兔鲜儿项目文档,视频
  16. Python 指定区域截图
  17. powerdesign使用手册
  18. windows平台下cocos2d-x+Python+VS2010的win32开发环境架设
  19. 下载的turbo c 3.0 怎样安装
  20. android 字符串中截取,【安卓按键精灵】几种字符串提取的方法(源码)

热门文章

  1. 数字图像处理个人练习02--点运算、空域平滑、空域锐化
  2. 测试 文章 与测试用例
  3. 托福备考需要准备哪些材料【zhasite】
  4. 固定资产管理软件方案
  5. Dom4j修改xml文件
  6. mapv结合百度地图treejs实现炫酷三维大数据可视化效果
  7. 4. MIZ7035 HDMI测试【PCIE视频传输】
  8. 一个游戏开发者的技能树
  9. 对我来说值得纪念的日子.. ..^_^
  10. APAP中REFRESH、CLEAR和FREE的区别