消息队列
信号能够传送的信息量有限
管道只能传送无格式的字节流
消息队列就是一个消息链表,消息可以看作是一个记录,具有特定的格式
消息队列的分类:
posix(可移植的操作系统接口)消息队列
系统v消息队列:是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除
键值
每个消息队列都在系统范围内对应唯一的键值,也是获得消息队列描述字的方法
返回文件名对应的键值
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(char *pathname,char proj)
pathname:文件名
proj:项目名(不为0即可)
打开、创建
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key,int msgflg)
key:键值,由ftok获得(设为ipc_private时会创建一个新的消息队列)
msgflg:标志位
标志位常用取值:
IPC_CREATE 创建新的消息队列
IPC_EXCL 与create一同使用,如果要创建的消息队列已经存在,返回错误
IPC_NOWAIT 读写消息队列要求无法得到满足时,不阻塞
返回值:与健值key相对应的消息队列描述字
示例代码如下:
int open_queue(key_t keyval){
int qid;
if((qid=msgget(keyval,IPC_CREAT))==-1){
return (-1);
}
return (qid);
}
发送消息
#include <sys/types.h>
#incldue <sys/ipc.h>
#incldue <sys/msg.h>
int msgsnd(int msqid,sturct msgbuf *msgp,int msgsz,int msgflg)
msqid:消息对列的id
msgp: 存放消息的结构
msgsz:消息数据长度
msgflg:发送标志,IPC_NOWAIT指明在消息队列没有足够空间容纳要发送的消息时,
msgsnd是否等待
消息格式:
struct msgbuf{
int mtype;/*消息类型>0*/
char mtext[1];/*消息数据的首地址*/
};
接收消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)
从消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结
构中,成功读取后,队列中的这条消息将被删除
示例代码如下:
int read_message(int qid,long type,struct mymsgbuf *qbuf){
int result,length;
/*去掉type类型的长度*/
length=sizeof(struct mymsgbuf)-sizeof(long);
if((result=msgrcv(qid,qbuf,length,type,0))==-1){
return (-1);
}
return (result);
}
示列代码如下:
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct msg_buf{
int mtype;
char data[255];
};
int main(){
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;
/*消息的创建*/
key=ftok("/home/retacn/tmp/app/2",'a');
printf("key=[%x]\n",key);
/*打开消息队列*/
msgid=msgget(key,IPC_CREAT|0666);/*通过文件对应*/
if(msgid==-1){
printf("create error\n");
return -1;
}
/*消息的发送*/
msgbuf.mtype=getpid();
strcpy(msgbuf.data,"test ha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
if(ret==-1){
printf("send message err\n");
return -1;
}
/*消息的接收*/
memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
if(ret==-1){
printf("recv message err\n");
return -1;
}
printf("recv msg=[%s]\n",msgbuf.data);
}
执行结果如下:
[root@localhost app]# gcc msg.c -o msg
[root@localhost app]# ./msg
key=[6105a185]
recv msg=[test ha]
- 浏览: 263811 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2433Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1326U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1141Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1287链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1041DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 962Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2185安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1369linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 891linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 755字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记三
2013-04-04 14:03 791memdev.h文件示例代码如下: #ifndef _MEM ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 590竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 814用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83812m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1170串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10821 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 975嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 428画个草图也挺过瘾 -
进程间通信学习笔记一(管道通信)
2013-02-01 20:08 1420进程间通信(ipc) 应用场景: 数据传输 资源共享 通知事件 ... -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 795信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ...
相关推荐
在IT领域,MFC(Microsoft Foundation ...学习完这个教程后,开发者应该能够熟练地在MFC应用中实现进程间通信,从而提升程序的扩展性和协作性。对于想要深入理解和应用MFC的程序员来说,这是一个不可错过的章节。
本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...
### 消息队列Activemq学习笔记 #### MQ入门概述 消息队列(Message Queue,简称MQ)是一种用于在应用程序之间传递数据的机制。它允许应用之间通过发送消息进行通信,而无需直接调用对方。 ##### 前言:MQ=消息...
消息队列是另一种进程间通信的方式,它提供了一种有序的消息传递机制。在ORANGE’S系统中,每个进程都可以发送消息到队列,而其他进程则可以从队列中接收消息。这种通信方式可以确保消息的顺序性,并且避免了竞争...
### Linux中的消息队列学习笔记 #### 消息队列概念 消息队列是一种进程间通信方式,允许发送包含一定格式的数据消息。消息队列中的消息由消息类型和消息文本组成,消息类型是一个整数值,它用于区分不同类型的事件...
uCOS-II 的消息队列是一种进程间通信机制,允许不同的任务之间exchange 数据。消息队列由一个数组组成,每个元素存储一个消息指针。消息队列的实现主要涉及到三个步骤:创建消息队列、发送消息和接收消息。 创建...
在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...
**RabbitMQ学习笔记与软件插件详解** RabbitMQ是一种广泛应用的消息中间件,它基于AMQP(Advanced Message Queuing Protocol)协议,提供可靠的消息传递服务。在分布式系统中,RabbitMQ扮演着数据交换中心的角色,...
Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...
RocketMQ学习笔记主要涵盖了消息队列(MQ)的相关知识,内容深入浅出,不仅包含理论知识,还融入了实战案例和源码分析,适用于希望掌握RocketMQ的开发者。 首先,RocketMQ是一个分布式、开源的消息中间件,它起源于...
本文主要探讨了操作系统中的进程与线程,以及进程间通信的基础概念。 一、进程 进程是操作系统中运行程序的实例,它包含了程序的代码、数据、状态信息等。一个进程在某一时刻可能处于运行、就绪、阻塞三种状态之一...
#### Lesson17: 进程间通信 - 进程之间通过管道、共享内存等方式交换数据。 #### Lesson18: ActiveX控件 - 创建和使用ActiveX控件,增强应用程序的功能。 #### Lesson19: 动态链接库DLL - 创建和使用动态链接库...
笔记涵盖了从Windows程序内部运行机制到MFC程序框架、消息映射机制、DC获取、菜单编程、对话框编程、图形绘制、文件操作、文档和串行化、网络编程、多线程和简单聊天室制作、线程同步与异步套接字编程、进程间通信、...
1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...
第四周的学习内容通常会涉及进程管理、线程概念以及进程间通信等相关知识点。 一、进程管理 在操作系统中,进程是程序的一次执行过程,它是系统进行资源分配和调度的基本单位。第四周可能会讲解以下几个方面的内容...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
1. **Socket基本概念**:Socket在计算机网络中扮演着桥梁的角色,它提供了进程间通信(IPC)的能力,尤其是跨越网络的进程间通信。Socket分为流式Socket(TCP)和数据报Socket(UDP)两种类型,分别对应于面向连接和...
2. 进程间通信:VxWorks支持消息队列、信号量、共享内存等机制,实现进程间的数据交换。 3. 错误处理:使用VxWorks提供的错误码和日志记录功能,进行故障诊断。 4. 系统调用:通过系统调用接口(sysLib)访问操作...
本学习笔记涵盖了VC++的基础知识、MFC程序框架、消息映射机制、DC的获取、菜单编程、对话框编程、图形绘制、文件操作、网络编程、多线程编程、进程间通信、ActiveX控件、动态链接库、Hook钩子函数等方面的知识点。...