IPC-----消息队列
消息队列(报文队列):两个进程间通过发送数据块的形式进行通信。一个进程把需要发送的消息通过一个函数发送到消息队列中,另一个进程再从消息队列中读取该消息。
函数:
# include <sys/types.h>
# include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id); //生成下面函数的key.可认为是一个端口号
int msgget(key_t key, int msgflg);//创建消息队列,返回消息队列的 msgid
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);//接收消息队 列中的消息,把接收到的内容写入msgp中。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//将msgp中的内容读入消息 队列中。
struct msgstru
{
long mtype; //大于0
char mtext[用户指定大小];
};
msgflg:
1.IPC_CREAT:如果没有就创建,有就打开。
2.IPC_EXCL:本身没多大意义
3.IPC_CREAT|IPC_EXCL:如果没有就创建,有就出错返回,保证每一次创建都是全新的。
特点:
双向通信。
消息队列是随内核持续的。只有在内核重启或显示删除一个消息队列时,才会被真正删除。
消息队列是基于消息的。且消息队列的读取不一定是先入先出。
每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节
每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)。
可避免同步和阻塞问题。
comm.h1 #pragma once2 #include<stdio.h>3 #include<sys/types.h>4 #include<sys/ipc.h>5 #include<sys/msg.h>6 #include<stdlib.h>7 #include<string.h>8 9 #define _PATH_ "."10 #define _PROJ_ID_ 0x777711 #define _MAX_NUM_ 25612 #define _SERVER_ 113 #define _CLIENT_ 214 struct msgstru15 {16 long mtype;17 char mtext[_MAX_NUM_];18 };19 int creat_msg_queue();20 int get_msg_queue();21 int send_msg(int msgid,char* text,long type);22 int recv_msg(int msgid,char* text,long type);23 int distroy_msg_queue(int msgid);comm.c1 #include"comm.h"2 static int comm_msg_queue(int flag)3 {4 key_t key = ftok(_PATH_,_PROJ_ID_);5 if(key == -1)6 {7 perror("ftok");8 return -1;9 }10 int msgid = msgget(key,flag);11 if(msgid==-1)12 {13 perror("msgget");14 return -1;15 }16 return msgid;17 }18 int creat_msg_queue()19 {20 return comm_msg_queue(IPC_CREAT|IPC_EXCL|0666);21 }22 int get_msg_queue()23 {24 return comm_msg_queue(IPC_CREAT);25 }26 int send_msg(int msgid,char *text,long type)27 {28 struct msgstru msg;29 msg.mtype = type;30 strcpy(msg.mtext,text);31 if(msgsnd(msgid,&msg,sizeof(msg.mtext),0)==-1)32 {33 perror("msgsnd");34 return -1;35 }36 return 0;37 }38 int recv_msg(int msgid,char *text,long type)39 {40 struct msgstru msg;41 memset(msg.mtext,'\0',sizeof(msg.mtext));42 if(msgrcv(msgid,&msg,sizeof(msg.mtext),type,0)==-1)43 {44 perror("msgrcv");45 return -1;46 }47 strcpy(text,msg.mtext);48 return 0;49 50 }51 int distroy_msg_queue(int msgid)52 {53 if(msgctl(msgid,IPC_RMID,NULL)==-1)54 {55 perror("msgctl");56 return -1;57 }58 return 0;59 }server.c1 #include"comm.h"2 int main()3 { 4 int msgid = creat_msg_queue();5 if(msgid == -1)6 {7 return -1;8 }9 char buf[_MAX_NUM_];10 while(1)11 { 12 memset(buf,'\0',sizeof(buf));13 fflush(stdout);14 printf("please say# ");15 gets(buf);16 if(send_msg(msgid,buf,_SERVER_)==-1)17 {18 return -1;19 } 20 if(recv_msg(msgid,buf,_CLIENT_)==-1)21 {22 return -1;23 }24 printf("client: %s\n",buf);25 }26 distroy_msg_queue(msgid);27 return 0;28 }client.c1 #include"comm.h"2 int main()3 { 4 int msgid = get_msg_queue();5 if(msgid==-1)6 { 7 return -1;8 }9 char buf[_MAX_NUM_];10 while(1)11 { 12 if(recv_msg(msgid,buf,_SERVER_)<0)13 { 14 return -1;15 }16 printf("server: %s\n",buf);17 fflush(stdout);18 memset(buf,'\0',sizeof(buf));19 printf("please say# ");20 gets(buf);21 if(send_msg(msgid,buf,_CLIENT_)==-1)22 { 23 return -1;24 }25 }26 return 0;27 }结果:[fbl@localhost msg_queue]$ ./server
please say# hello
client: hi
please say# how are you?
client: fine,and you?
please say# fine[fbl@localhost msg_queue]$ ./client
server: hello
please say# hi
server: how are you?
please say# fine,and you?
server: fine
please say#
转载于:https://blog.51cto.com/fengbaoli/1763055
IPC-----消息队列相关推荐
- Linux进程间通信(IPC)-------消息队列
消息队列是进程间通信的一种方法,他有两个操作,一个进程来发送消息(也就是向内存中写入数据),另一个是获取消息(也就是另外一个进程在内存中读取数据) 下面来看消息队列的 创建,写入,读取等需要用到的函数 ...
- linux c 消息队列简介
消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...
- 进程间通信——消息队列(Message queue)
在Linux中,IPC消息队列是一个双向通信的全内存设计,即内核保证了读写顺序和数据同步,并且是性能比较好的先进先出的数据结构.消息队列的应用场景:比如异步任务处理,抢占式的数据分发,顺序缓存区等. ...
- 第15章 进程间通行 15.6 XSI IPC 15.7 消息队列
2019独角兽企业重金招聘Python工程师标准>>> 15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 ...
- 专题 12 IPC之消息队列
1.概述 消息队列是内核地址空间中的内部链表,通过Linux内核在各个进程之间传递内容.消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识.内核中 ...
- 进程间通信IPC(一)(半双工管道和消息队列)
引言: 之前学习的进程之间交换信息的方法只能由fork或exec传送打开文件,或者文件系统.但是这种通讯方式有局限性,接下来将说明进程之间相互通信的其他技术--IPC(InterProcessComm ...
- IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成
一.消息对列 消息队列,是消息的链接表,存放在内核中.一个消息队列由一个标识符(即队列ID)来标识. 特点: 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级.消息队列独立于发送与接收进 ...
- IPC之——消息队列
消息队列作用: 可以用于两个没有联系的进程间通信,创建一个消息队列类似于打开了一个文件,两个不同的进程都可以进行操作 消息队列之函数介绍: 头文件:<sys/type.h> <sys ...
- Linux IPC实践(6) --System V消息队列(3)
消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid cl ...
- linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列
来源CSDN: CSDN-专业IT技术社区-登录blog.csdn.net 一.概念和原理 消息队列是另一种标准IPC,当然也大概遵循大部分标准 消息队列,它是存放消息(数据)的队列,而队列是先进先 ...
最新文章
- 重磅丨2018年人工智能标准化白皮书
- 最短编辑距离 python_最短编辑距离算法实现
- 2、ShardingSphere 之 Sharding-JDBC实现水平分表
- sklearn svm如何选择核函数_使用python+sklearn实现成对度量、相关性和核函数
- 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
- UNIX(多线程):13---condition_variable、wait、notify_one、notify_all
- 异常收集之:navicatdesignquery.sql.bak 系统找不到指定路径
- STM32工作笔记004---了解高速版PCB设计Cadence
- 关于本学期西南交通大学ACM-ICPC校集训队 训练计划(Beta 1.0)
- Pytorch损失函数BCELoss,BCEWithLogitsLoss
- 调研AutoGluon数据处理与Tabular-NN
- 【oracle】Linux环境安装Oracle客户端
- 职称计算机考试题库破解版2017,2017职称计算机考试题库及答案
- correl函数相关系数大小意义_教你利用Correl函数返回相关系数并确定属性关系
- 领袖一般会采用什么方式?
- 美团的战略、战术和能力圈 附下载地址
- 上网速度(网速)的计算
- 来认识一下哥德尔不完备定理
- c语言 运行出现错误代码,运行出现 debug error
- 这30个CSS选择器,你必须熟记(中)
热门文章
- continue 的用户及实例
- 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》
- 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例
- 宣布在日本地区正式发布 Windows Azure
- 对lua协程的一点理解
- gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...
- linux ndk编译so,有的APP NDK 编译的SO文件 无法调用 PackageManager
- element的分页怎么改中文配置_vue想改变element分页样式
- java 多态判断非空_收藏Java 面试题全梳理
- logisim输出变成红色的e_新车实拍解析 福特Mustang Mach-E亮点实拍图解