消息队列(报文队列):两个进程间通过发送数据块的形式进行通信。一个进程把需要发送的消息通过一个函数发送到消息队列中,另一个进程再从消息队列中读取该消息。

函数:

# 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:如果没有就创建,有就出错返回,保证每一次创建都是全新的。

特点:

  1. 双向通信。

  2. 消息队列是随内核持续的。只有在内核重启或显示删除一个消息队列时,才会被真正删除。

  3. 消息队列是基于消息的。且消息队列的读取不一定是先入先出。

  4. 每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节

  5. 每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)。

  6. 可避免同步和阻塞问题。

 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-----消息队列相关推荐

  1. Linux进程间通信(IPC)-------消息队列

    消息队列是进程间通信的一种方法,他有两个操作,一个进程来发送消息(也就是向内存中写入数据),另一个是获取消息(也就是另外一个进程在内存中读取数据) 下面来看消息队列的 创建,写入,读取等需要用到的函数 ...

  2. linux c 消息队列简介

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

  3. 进程间通信——消息队列(Message queue)

    在Linux中,IPC消息队列是一个双向通信的全内存设计,即内核保证了读写顺序和数据同步,并且是性能比较好的先进先出的数据结构.消息队列的应用场景:比如异步任务处理,抢占式的数据分发,顺序缓存区等. ...

  4. 第15章 进程间通行 15.6 XSI IPC 15.7 消息队列

    2019独角兽企业重金招聘Python工程师标准>>> 15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 ...

  5. 专题 12 IPC之消息队列

    1.概述 消息队列是内核地址空间中的内部链表,通过Linux内核在各个进程之间传递内容.消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识.内核中 ...

  6. 进程间通信IPC(一)(半双工管道和消息队列)

    引言: 之前学习的进程之间交换信息的方法只能由fork或exec传送打开文件,或者文件系统.但是这种通讯方式有局限性,接下来将说明进程之间相互通信的其他技术--IPC(InterProcessComm ...

  7. IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成

    一.消息对列 消息队列,是消息的链接表,存放在内核中.一个消息队列由一个标识符(即队列ID)来标识. 特点: 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级.消息队列独立于发送与接收进 ...

  8. IPC之——消息队列

    消息队列作用: 可以用于两个没有联系的进程间通信,创建一个消息队列类似于打开了一个文件,两个不同的进程都可以进行操作 消息队列之函数介绍: 头文件:<sys/type.h> <sys ...

  9. Linux IPC实践(6) --System V消息队列(3)

    消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid cl ...

  10. linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

    来源CSDN: CSDN-专业IT技术社区-登录​blog.csdn.net 一.概念和原理 消息队列是另一种标准IPC,当然也大概遵循大部分标准 消息队列,它是存放消息(数据)的队列,而队列是先进先 ...

最新文章

  1. 重磅丨2018年人工智能标准化白皮书
  2. 最短编辑距离 python_最短编辑距离算法实现
  3. 2、ShardingSphere 之 Sharding-JDBC实现水平分表
  4. sklearn svm如何选择核函数_使用python+sklearn实现成对度量、相关性和核函数
  5. 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
  6. UNIX(多线程):13---condition_variable、wait、notify_one、notify_all
  7. 异常收集之:navicatdesignquery.sql.bak 系统找不到指定路径
  8. STM32工作笔记004---了解高速版PCB设计Cadence
  9. 关于本学期西南交通大学ACM-ICPC校集训队 训练计划(Beta 1.0)
  10. Pytorch损失函数BCELoss,BCEWithLogitsLoss
  11. 调研AutoGluon数据处理与Tabular-NN
  12. 【oracle】Linux环境安装Oracle客户端
  13. 职称计算机考试题库破解版2017,2017职称计算机考试题库及答案
  14. correl函数相关系数大小意义_教你利用Correl函数返回相关系数并确定属性关系
  15. 领袖一般会采用什么方式?
  16. 美团的战略、战术和能力圈 附下载地址
  17. 上网速度(网速)的计算
  18. 来认识一下哥德尔不完备定理
  19. c语言 运行出现错误代码,运行出现 debug error
  20. 这30个CSS选择器,你必须熟记(中)

热门文章

  1. continue 的用户及实例
  2. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》
  3. 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例
  4. 宣布在日本地区正式发布 Windows Azure
  5. 对lua协程的一点理解
  6. gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...
  7. linux ndk编译so,有的APP NDK 编译的SO文件 无法调用 PackageManager
  8. element的分页怎么改中文配置_vue想改变element分页样式
  9. java 多态判断非空_收藏Java 面试题全梳理
  10. logisim输出变成红色的e_新车实拍解析 福特Mustang Mach-E亮点实拍图解