什么是消息队列:
消息队列提供了从一个进程向另一个进程发送一个有类型数据块的方法。用这种方法可以避免命名管道的同步和阻塞问题。消息队列是基于消息的,而管道是基于字节流的,并且消息队列的读取不一定是先入先出。
消息队列的操作:
消息队列的创建或者获取:
int msgget(key_t key, int msgflg);
参数描述:
key:是一个端口号,可以由ftok()生成
msgflg:  IPC_CREAT:如果IPC不存在,则创建,存在就打开
IPC_EXECL:单独使用无太大意义,与IPC_CREAT一块使用代表,IPC不存在创建,存在出错,返回
key_t ftok(const char *pathname, int proj_id);
生成唯一一个key供用户使用,返回一个消息队列标识符。
返回值:
成功返回消息队列的id,失败返回-1。
读取消息:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
参数描述:
msgid:消息队列的标识符
msgp:指向一个缓冲区的指针,用来暂时存放储存发送和接受的消息,是一个用户可以定义的通用结构。
struct msgstru{
long mtype; //大于0
char mtext;//用户指定大小
};
msgz:消息的大小
msgtyp:从消息队列中读取的消息形态
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常 数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而 会立即返回-1,如果执⾏行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定 错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取 阻塞等待的处理模式。
返回值:
成功返回实际读取到的字节数,失败返回-1。
发送消息:
int msgsnd(int msqid, const void *msgp, size_t msgz, int msgflg);
参数与读取消息函数的参数相同。
返回值;
成功返回0,失败返回-1。
消息队列的查看:
可以使用 ipcs -q 来查看系统中的消息队列;
可以使用ipcrm -q +消息队列id  来删除对应id的消息队列
消息队列的实例:
实现一个server和一个client程序,他们之间利用消息队列进行通信。
comm.h
#ifndef  _COMM_H_
#define  _COMM_H_
#ifndef  _COMM_H_
#define  _COMM_H_#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>#define PATHNAME "."
#define PROJ_ID 0x666#define SERVER_TYPE 1
#define CLIENT_TYPE 2//自定义一个缓冲区用来暂时存储发送或者接收的数据
struct msgbuf
{long mytype;char mtext[1024];
};
int createMsgQueue();
int getMsgQueue();
int destroyMsgQueue(int msgid);
int sendMsg(int msgid, int type, char *msg);
int recvMsg(int msgid, int recvType, char out[]);
#endif
comm.c
#include "comm.h"//创建或者打开消息队列
static int commMsgQueue(int flag)
{key_t key = ftok(PATHNAME, PROJ_ID);if(key < 0){perror("ftok");return -1;}//根据flag的不同选择打开还是创建int msgid = msgget(key, flag);if(msgid < 0){perror("msgget");return -2;}return msgid;
}
int createMsgQueue()
{return commMsgQueue(IPC_CREAT|IPC_EXCL|0666);
}
int getMsgQueue()
{return commMsgQueue(IPC_CREAT);
}
int destroyMsgQueue(int msgid)
{//删除消息队列if(msgctl(msgid, IPC_RMID, NULL)<0){perror("msgctl");return -1;}return 0;
}
//发送消息(参数:发送者,发送内容的类型,发送的内容)
int sendMsg(int msgid, int who, char *msg)
{//buf 自定义的缓冲区,用来暂存数据struct msgbuf buf;buf.mytype = who;strcpy(buf.mtext, msg);//进行发送,将缓冲区中的数据进行发送if(msgsnd(msgid, (void *)&buf, sizeof(buf.mtext), 0) < 0){perror("msgsnd");return -1;}return 0;
}
//接收消息(参数:接受者,接受类型,接受之后存放位置)
int recvMsg(int msgid, int who, char out[])
{struct msgbuf buf;buf.mytype = who;//接收数据,将接收的数据写入到缓冲区中if(msgrcv(msgid, (void *)&buf, sizeof(buf.mtext), recvType, 0)< 0){perror("msgrcv");return -1;}//将数据从缓冲区存放到指定位置strcpy(out, buf.mtext);return 0;
}
server.c
#include"comm.h"
int main()
{//服务器端进行消息队列的创建int msgid = createMsgQueue();//缓冲区char buf[1024];while(1){buf[0] = 0;//接受客户端发送的消息recvMsg(msgid, CLIENT_TYPE, buf);printf("client #  %s\n", buf);printf("please enter: ");fflush(stdout);//从标准输入输入内容到缓冲区ssize_t s = read(0, buf, sizeof(buf));if(s > 0){buf[s-1] = 0;//将缓冲区内容发送至客户端sendMsg(msgid, SERVER_TYPE, buf);printf("send done...\n");}}//服务器端创建,服务器端销毁消息队列destoryMsgQueue(msgid);return 0;
}
client.c
#include "comm.h"
int main()
{//打开消息队列int msgid = getMsgQueue();//缓冲char buf[1024];while(1){buf[0] = 0;printf("please enter:");fflush(stdout);//从标准输入输入到缓冲ssize_t s = read(0, buf, sizeof(buf));if(s>0){buf[s-1] = 0;//将缓冲发送到服务器sendMsg(msgid, CLIENT_TYPE, buf);printf("send done...\n");}//接受服务器的回应recvMsg(msgid, SERVER_TYPE, buf);printf("Server : %s\n", buf);}return 0;
}
运行结果:

Linux消息队列实现进程间通信相关推荐

  1. PHP下操作Linux消息队列完成进程间通信的方法

    2019独角兽企业重金招聘Python工程师标准>>> 来源:http://www.jb51.net/article/24353.htm 关于Linux系统进程通信的概念及实现可查看 ...

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

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

  3. linux 消息队列 msgget/msgsnd/msgrecv

    专栏内容:linux下并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息:地势坤,君子以厚德载物. 目录 前言 概述 原理 消息队列的大小 查看资源 接口 代码演示 结尾 前言 本专栏主要分 ...

  4. linux消息队列非亲缘,linux进程

    linux进程Tag内容描述: 1.linux消息队列进程通信 一.消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制 ...

  5. linux.调整收发队列,linux消息队列通信

    程序目的:学习linux消息队列通信 所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl() 首先介绍每个函数的用法: (1)msgget 使用格式: #include ...

  6. linux 消息对lie_Linux进程间通信之消息队列总结

    一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构(消息队列.信号量或共享存储段)都用一个非负整数的标识符( i d ...

  7. [Linux]消息队列

    我们知道进程间通信的方法有多种,主要有管道,消息队列,信号量,共享内存,socket等.之前介绍过管道,今天再介绍一个新的概念–消息队列. 消息队列:将一个进程到另一个进程之间发送数据块的方式.这些发 ...

  8. Linux消息队列原理与应用

    消息队列 (也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制使用共同的授权方法.只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源.这 ...

  9. LINUX 消息队列的容量探讨

    在LINUX进程间通信方法有很多种,其中有消息队列.信号量.共享内存,而这三种进程间通信方法又分为System V IPC 和 POSIX IPC 两类. 接下来要探讨的是POSIX的消息对列(实际编 ...

  10. php 阻塞消息队列,linux 消息队列阻塞

    php 使用socket告知Python,可以在socket上声明是及时推送还是延迟推送######哦?愿闻其详 那要是很多用户同时并发呢######system 调用外部程序是一种办法######@ ...

最新文章

  1. windows7 php 无法启动服务,windows update服务无法启动怎么解决?
  2. 【java】兴唐第十九节课(内部类)
  3. 女性程序员大会ghc_在女性科技大会上成为男人的感觉
  4. 《最受欢迎的女友职业排行榜Top10》
  5. sidekiq安装及使用
  6. linux查看etl进程,常见ETL工具
  7. java 虚拟机初始堆_了解java虚拟机—堆相关参数设置(3)
  8. web前端学习笔记(二)---Django
  9. 普通话转粤语_语音转文字评测:几款语音转文字app,你了解多少?
  10. 软件测试全套教程,软件测试自学线路图
  11. PC机组成——主板、芯片组与BIOS
  12. 基于springCloud gateway请求包含url包含{}大括号特殊字符的问题
  13. gc算法 java_Java的GC机制及算法
  14. 实战:k8s之Longhorn备份恢复-2022.2.26
  15. 高等数学(第七版)同济大学 习题12-4 个人解答
  16. CS很难发论文?这些技巧你都get了吗?
  17. DKN: Deep Knowledge-Aware Network for News Recommendation简析
  18. 百鸡百钱python教程_python百钱百鸡
  19. 2020美赛C题解题思路(A Wealth of Data)
  20. 外卖跑腿APP开发的优势和功能

热门文章

  1. [寻找环链表入口点] 快慢指针数学原理剖析
  2. 勒索病毒端口勒索病毒通过哪个端口传播
  3. WiFi信道频率对照表
  4. Logo设计技巧和方法
  5. 京东架构专家分享京东架构之路
  6. The Algorithms
  7. 基于3DGIS+BIM的智慧园区运维管理平台
  8. 计算机的进制的转换公式,计算机进制转换公式
  9. 2019计算机保研 中科院信工所夏令营+中科院软件所九推记录
  10. js继承的几种实现方式