1.msgsnd函数

(1)功能:把一条消息添加到消息队列中

(2)原型:intmsgsnd(int msqid, const void* msgp. size_t msgsz, int msgflg);

(3)参数:msgqid:由msgget函数返回的消息队列标识码

msgp:是一个指针,指针指向准备发送的消息

msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型

msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情

(4)返回值:成功返回0,;失败返回-1

(5)msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误

(6)消息结构在两方面收到制约。首先它必须小于系统规定的上限值;其次,它必须以一个long int长整数开始,接收者函数将利用这个长整数确定消息的类型

(7)消息结构参考形式如下:

struct msgbuf {

long mtype;

char mtext[1];

};

2.msgrcv函数

(1)功能:是从一个消息队列接收消息

(2)原型:ssize_t msgrcv(int msgqid, void*msgp, size_t msgsz, long msgtyp, int msgflg);

(3)参数:msgid:由msgget函数返回的消息队列标识码

msgp:是一个指针,指针指向准备接收的消息

msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型

msgtype:它可以实现接收优先级的简单形式

msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事

(4)返回值:成功返回实际放到接收缓冲区里去的字符个数,失败返回-1

(5)msgtype=0返回队列第一条消息

(6)msgtyp>0返回队列第一条类型等于msgtype的消息

(7)msgtyp<0返回队列第一条类型小于等于msgtype绝对值的消息(消息类型最小的先接收)

(8)msgflg=IPC_NOWAIT,队列没有可读消息不等待,返回ENOMSG错误

(9)msgtyp=MSG_NOERROR,消息大小超过msgsz是被截断

(10)msgtyp>0且msgflg=MSG_EXCEPT,接收类型不等于msgtype的第一条消息

3.示例

msg_send.cpp

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)struct MSG {long mtype;char mtext[1];
};int main(int argc, char* argv[]) {if(argc != 3) {fprintf(stderr, "Usage: %s <bytes> <type>\n", argv[0]);exit(EXIT_FAILURE);}int len = atoi(argv[1]);int type = atoi(argv[2]);int msgid;msgid = msgget(1234, 0); //按照原来创造的权限打开if(msgid == -1) ERR_EXIT("msgget");struct MSG* ptr;ptr = (struct MSG*)malloc(sizeof(long)+len);ptr->mtype = type;if(msgsnd(msgid, ptr, len, 0) <0)ERR_EXIT("msgsnd");return 0;
}

msg_recv.cpp

./recv -n -t 2

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)struct MSG {long mtype;char mtext[1];
};#define MSGMAX 8192int main(int argc, char* argv[]) {int flag = 0;int type = 0;int opt;while(1) {opt = getopt(argc, argv, "nt:");if(opt == '?')exit(EXIT_FAILURE);if(-1 == opt)break;switch(opt) {case 'n':flag |= IPC_NOWAIT;break;case 't'://int n = atoi(optarg);//printf("n=%d\n", n);type = atoi(optarg);break;}}int msgid;msgid = msgget(1234, 0); //按照原来创造的权限打开if(msgid == -1) ERR_EXIT("msgget");struct MSG* ptr;ptr = (struct MSG*)malloc(sizeof(long)+MSGMAX);ptr->mtype = type;int n = 0;if((n=msgrcv(msgid, ptr, MSGMAX, type, flag)) < 0)ERR_EXIT("msgsnd");printf("read %d bytes type=%ld\n", n, ptr->mtype);return 0;
}

system v 消息队列(二)相关推荐

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

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

  2. System V 消息队列

    一.System V 消息队列 有一个队列,队列存放各种消息.每个进程可以把数据封存在消息中,再放入队列.每个进程都可以拿到消息队列,再从中取出/放入消息. 消息队列也有管道一样的不足,就是每个消息的 ...

  3. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  4. System V消息队列

    简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...

  5. Linux网络编程之System V消息队列

    System V消息队列函数: #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> int ...

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

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

  7. 06.System V 消息队列

    1.概述 System V消息队列使用消息队列标识符(message queue identifier)标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个 ...

  8. system V消息队列的使用

    最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...

  9. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  10. 细说linux IPC(十):system V 消息队列

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...

最新文章

  1. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...
  2. Swift中的闭包例子
  3. element ui input视图没刷新_[Selenium自动化测试实战] 如何在UI自动化测试中加入REST API的操作...
  4. 网页滚动文字特效的代码
  5. 文件下载及web文件的contentType类型大全
  6. 显示桌面图标不见了的解决方法
  7. Jenkins在Windows下的安装与配置
  8. python相关的证书_有哪些含金量较高的Python证书?
  9. 我的世界空岛生存服务器制作,我的世界Wishing服务器-RPG丨空岛丨生存丨[1.12.2-1.16.1]...
  10. 计算机拆机步骤图解,惠普笔记本拆机步骤图解
  11. 乔巴机器人 番外篇_乔巴机器人五只合体图+10个小乔巴+【附合体动图】
  12. 北京职称计算机证书有效期,有关职称评审常见问题的解答(北京地区)
  13. python保存图片
  14. Uniapp-APP后台保活插件(安卓后台保活)
  15. 如何看linux是arm还是amd_享受还是想瘦?看游泳如何让你“享瘦”
  16. 中信涂猪android抓包,玩卡计划 篇二:中信《鼠来宝》规则攻略,珠光宝气之后的活动!还记得去年的涂猪吗?...
  17. 微信web开发者工具无法打开网络连接失败,网上的办法都无法解决的小伙伴可以用我这个办法
  18. 1079 PIPI的存钱罐
  19. redis设置key的时间戳
  20. 微软CRM系统二次开发步骤以及注意事项

热门文章

  1. 利用Arduino对路由器进行调试,居然这么简单!
  2. 《嵌入式系统可靠性设计技术及案例解析》读书笔记(七)
  3. MuPlayer『百度音乐播放内核』
  4. 在jquery的ajax方法中的success中使用return要注意的问题
  5. Amoeba-mysql开源项目高可用读写分离
  6. 不用加号实现两整数相加
  7. C#中通过Selenium定位a标签的问题
  8. (035) Linux之其他命令
  9. CMS收集器中两个致命的问题
  10. linux多线程入库hive,hiveserver2 定时挂采坑记