进程间通信(IPC)之————消息队列

一.消息队列

前面提到的进程间通信的一种最基本的方式就是管道,而现在来谈一下另一种进程间的通信方式——消息队列。消息队列是从一个进程向另一个进程发送数据块的方式,每个数据块都有其类型,接收者接收的数据块也可以有不同的类型,这样我们就可以通过发送消息的方式来避免命名管道的同步和阻塞问题。

消息队列不同于管道的是,管道是基于字节流的,而消息队列是基于消息的,而且消息队列的读取方式不一定是先进先出的,消息队列是用链表实现的;但相同的是,它们有一样的不足,就是都有固定的大小,每个消息的大小都有上限(msgmax),每个队列的大小也有上限(msgmnb),而系统中队列的个数同样有上限(msgmni)。

二.IPC对象数据结构

内核为每个IPC对象都维护了一个数据结构(/usr/include/linux/ipc.h):

三.消息队列结构

(usr/include/linux/msg.h)

可以看到消息队列的结构中第一个就是IPC结构体,这是每个IPC对象都有的,剩下的才是各自所私有的成员。

四.关于消息队列的函数

  1. 创建一个新的消息队列或者获得一个已有的消息队列

函数参数中,key可以认为是一个端口号,用函数ftok生成

函数ftok把一个已经存在的路径名和一个整数标识转换成一个key_t值,这里的proj_id只有其低八位被使用。

而msgget函数参数中第二个msgflg是消息队列的标志,IPC_CREATIPC_EXCL,其中当IPC_CREAT单独使用时,如果共享内存已存在就返回已存在的操作符,若不存在就会新建一个共享内存的额操作符,而当IPC_CREATIPC_EXCL一起使用时,当共享内存不存在就会新建一个,若存在就会返回一个错误值-1。也就是说IPC_EXCL单独使用并没有什么意义,只有和IPC_CREAT一起使用可以保证所得到的对象是新建的而不是打开已有的对象。

2. 消息队列的发送/接收消息

在函数参数中,

msqid表示消息队列的标识码;

msgp是指向消息队列的一个缓冲区,用来暂时存储发送和接收的消息,它是一个用户可定义的结构体,如下:

msgsz则表示消息的大小;

msgtype就是指从消息队列内读取的消息形态,也就是指要读取哪一方的数据,若值为零,则表示消息队列中的所有消息都会被读取;

msgflg用来指明当队列中没有数据的情况下应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若消息队列已满,则magsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列为空时,不等待而是直接返回-1,并设定错误码为ENOMSG,当msgflg为0时,则不论msgsnd()执行时队列已满还是msgrcv()执行时队列为空,一律采取阻塞等待的处理模式。

3. 消息队列属性

函数参数中同样msqid表示消息队列的标识码,

cmd表示对msqid标识的消息队列执行以下三种cmd操作:

IPC_STAT,该命令用来获取消息队列对应的msqid_ds数据结构,并将其保存到buf指定的地址空间;

IPC_SET,该命令用来设置消息队列的属性,要设置的属性存储在buf中;

IPC_RMID,该命令从内核中删除msqid标识的消息队列。

下面举个栗子用一下上面的函数:

首先当然是要创建出两个进程了,比如有一端msg_client和另一端msg_server,将要使用的函数封装到同一个头文件comm.h内,同时在comm.c中实现:

为了区分出消息队列是新创建的还是返回已存在的,可以分为两个获取消息队列的函数,使用creat_msg()时,因为IPC_CREAT和IPC_EXCL是一起使用的,可以确保返回的消息队列是新创建的,而使用get_msg()函数就不一定了;

在两个进程中,都用get_msg()函数来获取消息队列,一个先接收消息另一个先发送消息,这样来回就完成了进程间的通信。

《完》

时间: 2024-10-15 21:23:13

进程间通信(IPC)之————消息队列的相关文章

进程间通信IPC:消息队列,信号量,共享内存

2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队列,信号量,共享内存. ipcs 查看ip对象共享内存,信号量,消息队列等信息ipcrm 删除一个IP对象 Linux为用户提供了完善的,强大的网络功能完善的内置网络:其他操作系统不包含如此紧密的和内核结合在一起的网络部分 共享内存标示符的获取有两种方法:ftok(pathname,id)另一个是K

进程间通信(IPC)之消息队列

★IPC方法包括管道(PIPE).消息队列(Message_Queue).旗语.共用内存(ShareMemory)以及套接字(Socket).进 程间通信主要包括了管道.系统IPC(包括了消息队列.信号以及共享存储).套接字(SOCKET).此文将详细叙述消息队列的相 关内容. ★产生原因: 所谓消息队列,其实就是消息(数据)传输过程中保存的容器.既然有了管道通信的方式,何必又有消息队列呢? 因为根据管道的特性,我们知道其在一定程度上存在或多或少的局限性,首先匿名管道以及命名管道是随进程的,进

Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)

有3种称作XSI IPC的IPC:消息队列.信号量.共享存储.这种类型的IPC有如下共同的特性. 每个内核中的IPC都用一个非负整数标志.标识符是IPC对象的内部名称,为了使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案.因此,将每个IPC对象都与一个键相关联,将这个键(key)作为该对象的外部名.这个键的数据类型是key_t,通常在头文件<sys/types.h>中被定义为长整型,该键由内核变换成标识符. 有3种方式可以使客户进程和服务器进程在同一IPC结构上汇聚: (1)

System V IPC(1)-消息队列

一.概述                                                    System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&T System v UNIX上面,并遵循XSI标准,有时候也被称为XSI IPC. 本文先探讨消息队列: 1.消息队列允许进程以消息的形式交换数据.读写都是针对整条消息,不能读写消息的一部分,不像管道那样可以以流的形式读写任意字节. 2.消息队列除了包含数据外,还有一个整数来表示该消息的类型.读取消息

Linux 进程间通信(posix消息队列 简单)实例

Linux 进程间通信(posix消息队列 简单)实例 详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm 编译: gcc -o consumer consumer.c -lrt gcc -o producer producer.c -lrt /* * * Filename: producer.c * * Description: 生产者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM

进程间通信——XSI IPC之消息队列

进程间通信XSI IPC有3种:消息队列.共享内存.信号量.它们之间有很多相似之处,但也有各自的特殊的地方.消息队列作为其中比较简单的一种,它会有些什么东西呢,来一起探讨探讨.. 消息队列结构 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为是一个类型,接受进程接收的数据块可以有不同的类型值. 我们可以通过发送消息来避免命名管道的同步和阻塞问题. 消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出. 命名管道:

Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字

Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内:后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承了下来 linux进程间通信(IPC)有几种方式

多进程编程之进程间通信-管道和消息队列

1.进程间通信 Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道.消息队列.共享内存.信号量.套接口等等. 2.2.1 管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信. 无名管道pipe 无名管道由pipe()函数创建: #include <unistd.h> int pipe(int filedis[2]): 参数filedis返回两个文件描述符:file

UNIX IPC: POSIX 消息队列 与 信号

POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <mqueue.h> #include

System V IPC 之消息队列

消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型,接收消息的进程可以请求接收下一条消息,也可以请求接收下一条特定类型的消息. 相关数据结构 与其他两个 System V IPC 通信机制一样,消息队列也有一个与之对应的结构,该结构的定义如下: struct msqid_ds { struct ipc_perm msq_perm; struct m