LInux进程间通信之消息队列编程实例

  本文主要通过消息队列的编程实例来加深对消息队列的理解.

一、消息队列之创建

  创建一个消息队列,需要用到一个函数:

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

int msgget(key_t key,int msgflg);

  key:需要调用ftok函数来获取.

  msgflg:IPC_CREAT,不存在则创建,存在则返回已有的qid.

     IPC_CREAT|IPC_EXCL,不存在则创建,存在则返回出错.

  ftok函数原型如下:

#include<sys/types.h>
#include<sys/ipc.h>

key_t ftok(const char*pathname,int proj_id);

  ftok函数通过给定的路径名称取得其stat结构中的st_dev字段和st_info字段,然后将它们和项目id结合起来,然后产生一个键返回.

  为了方便使用,我们将创建消息队列与获取消息队列封装为两个函数:

//创建与打开消息队列公共函数
int MessageCommon(key_t key,int flag){
	int ret = 0;
	if((ret=msgget(key,flag))==-1){
		perror("msgget:");
		exit(-1);
	}
	return ret;
}
//创建全新的消息队列(服务端)
int CreateMessage(key_t qid){
        //消息队列也是具有权限结构的,因此在创建时给666权限
	return MessageCommon(qid,IPC_CREAT|IPC_EXCL|0666);
}
//打开已有的消息队列(客户端)
int GetMessage(key_t qid){
	return MessageCommon(qid,IPC_CREAT);
}

二、消息队列之发送消息

  使用消息队列发送消息用到了一个函数和一个结构体:

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

int msgsnd(int msgid,const void* msgp,size_t magsz,int msgflg);

  msgid:消息队列标识符

  msgp:发送的消息结构体指针

  msgsz:结构体中消息的大小(不是整个结构体的大小)

  msgflg:IPC_NOWAIT,消息队列满时返回-1

     0,消息队列满时阻塞.

  在通过msgsnd发送数据时,需要一个结构体来存放所发送的数据,及发送者的类型.

struct msgbuf{
        long mtype;        //消息类型,由用户自定义
        char mtext[1024];//发送的消息(长度、类型可以自行指定)
}

  因此,我们将发送消息也做一层封装:

//发送消息
void SendMessage(int msgid,const char* msg,int who){
	msgbuf buf;
	buf.mtype = who;                //消息类型
	strcpy(buf.mtext,msg);        //消息内容
	if(msgsnd(msgid,&buf,sizeof(buf.mtext),0) == -1){
		perror("msgsnd");
		DestoryMessage(msgid);
		exit(-2);
	}
}

三、消息队列之接收消息

  消息队列接收消息的函数原型如下:

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

ssize_t msgrcv(int qid,void *msgp,size_t msgsz,long msgtyp,int msgflg);

  qid:消息队列的标识符

  msgp:消息结构体指针

  msgsz:消息内容大小

  msgtyp:消息类型

  msgflg:同上

  封装之后的代码如下:

void ReceiveMessage(int msgid,char* msg,int who){
	msgbuf buf;
	if(msgrcv(msgid,&buf,sizeof(buf.mtext),who,0)==-1){
		perror("msgrcv");
		DestoryMessage(msgid);
		exit(-3);
	}
	strcpy(msg,buf.mtext);
}

四、消息队列的删除

  其函数原型如下:

#include<sys/type.h>
#include<sys/ipc.h>
#Include<sys/msg.h>

int msgctl(int msgid,int cmd,struct msgid_ds *buf);

  msgid:消息队列标识符

  cmd:所要采取的命令.IPC_RMID删除消息队列

  buf:权限信息

  封装后函数如下:

//消息队列的删除
void DestoryMessage(int msgid){
	if(msgctl(msgid,IPC_RMID,NULL) == -1){
		perror("msgctl");
		exit(-4);
	}
}

  以上便是消息队列的基本操作,关于消息队列通信实例为节省文章篇幅,请移步至:https://github.com/gaoxiaodiao/Linux/tree/master/LinuxCode/MessageQueue

时间: 2024-12-09 06:20:45

LInux进程间通信之消息队列编程实例的相关文章

[转]Linux进程间通信——使用消息队列

点击此处阅读原文 另收藏ljianhui的专栏初学Linux 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的

Linux进程间通信——使用消息队列

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息

linux进程间通信之消息队列

我们已经知道进程通信的方式是有多种的,在上一篇博客中讲述了通过管道实现简单的进程间通信,那么接下来我们看看与之类似的另一种方式,通过消息队列来实现进程间通信. 什么是消息队列 消息队列提供了一种由一个进程向另一个进程发送块数据的方法.另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块.消息队列的好处在于我们几乎可以完全避免同步问题,并且可以通过发送消息屏蔽有名管道的问题.更好的是,我们可以使用某些紧急方式发送消息.坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限

练习--LINUX进程间通信之消息队列MSG

https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某

Linux进程间通信(消息队列/信号量+共享内存)

写在前面 不得不说,Deadline果真是第一生产力.不过做出来的东西真的是不堪入目,于是又花了一早上重写代码. 实验内容 进程通信的邮箱方式由操作系统提供形如 send()和 receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上.在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱

Linux进程间通信:消息队列

一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我们可以通过发送消息 来避免命名管道的同步和阻塞问题.消息队列与管道不同的是,消息队列是基于消息的, 而管道是基于字节流的,且消息队列的读取不一定是先入先出.消息队列与命名管道有一 样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节 数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMN

Linux进程间通信(二) - 消息队列

消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点(管道请查阅我的另一篇文章:http://www.cnblogs.com/linuxbug/p/4863724.html): Ø  一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向其中写消息时,管道和FIFO必须已经打开来读,否则写进程就会阻塞(默认情况下). Ø 

Linux 消息队列编程

消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数的标识符加以标示(如共享内存的shmid.信号量的semid.以及消息队列的msgid).不同于文件描述符,IPC标识符不是一个小的非负整数,它是一个int型的整数,当一个标识符被创建,以后又被删除时,这个整数持续加1,达到整型的最大值后,重新回到0. 但是每一个IPC对象在内核中的标识符只能在内部

linux 进程间消息队列通讯

转自:http://blog.csdn.net/lifan5/article/details/7588529 http://www.cnblogs.com/kunhu/p/3608589.html 前言: 消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式 从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是 相互独立的,每个消息队列中的消息又构成