system v 消息队列(二)
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 消息队列(二)相关推荐
- (P26)system v消息队列:msgsnd函数 ,msgrcv函数
文章目录 1.msgsnd函数 2.msgrcv函数 1.msgsnd函数 功能:把一条消息添加到消息队列中原型:int msgsnd(int msqid, const void *msgp, siz ...
- System V 消息队列
一.System V 消息队列 有一个队列,队列存放各种消息.每个进程可以把数据封存在消息中,再放入队列.每个进程都可以拿到消息队列,再从中取出/放入消息. 消息队列也有管道一样的不足,就是每个消息的 ...
- linux进程间通信:system V消息队列
文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...
- System V消息队列
简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...
- Linux网络编程之System V消息队列
System V消息队列函数: #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> int ...
- System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍
System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...
- 06.System V 消息队列
1.概述 System V消息队列使用消息队列标识符(message queue identifier)标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个 ...
- system V消息队列的使用
最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- 细说linux IPC(十):system V 消息队列
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...
最新文章
- 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...
- Swift中的闭包例子
- element ui input视图没刷新_[Selenium自动化测试实战] 如何在UI自动化测试中加入REST API的操作...
- 网页滚动文字特效的代码
- 文件下载及web文件的contentType类型大全
- 显示桌面图标不见了的解决方法
- Jenkins在Windows下的安装与配置
- python相关的证书_有哪些含金量较高的Python证书?
- 我的世界空岛生存服务器制作,我的世界Wishing服务器-RPG丨空岛丨生存丨[1.12.2-1.16.1]...
- 计算机拆机步骤图解,惠普笔记本拆机步骤图解
- 乔巴机器人 番外篇_乔巴机器人五只合体图+10个小乔巴+【附合体动图】
- 北京职称计算机证书有效期,有关职称评审常见问题的解答(北京地区)
- python保存图片
- Uniapp-APP后台保活插件(安卓后台保活)
- 如何看linux是arm还是amd_享受还是想瘦?看游泳如何让你“享瘦”
- 中信涂猪android抓包,玩卡计划 篇二:中信《鼠来宝》规则攻略,珠光宝气之后的活动!还记得去年的涂猪吗?...
- 微信web开发者工具无法打开网络连接失败,网上的办法都无法解决的小伙伴可以用我这个办法
- 1079 PIPI的存钱罐
- redis设置key的时间戳
- 微软CRM系统二次开发步骤以及注意事项