当前位置:首页 > 开发 > 开源软件 > 正文

C语言进程间通信--消息队列

发表于: 2011-11-29   作者:acme_ltt   来源:转载   浏览:
摘要: Linux操作系统system V进程间通信,主要有三种: 1、消息队列; 2、信号量; 3、内存共享。       消息队列是消息的链表,存放在内核中并由消息队列标识符标识。 Linux消息队列管理: 1、创建消息队列      在使用一个消息队列前,需要使用msgget函数创建该消息队列,其函数声明:  

Linux操作系统system V进程间通信,主要有三种:

1、消息队列;

2、信号量;

3、内存共享。

 

    消息队列是消息的链表,存放在内核中并由消息队列标识符标识。

Linux消息队列管理:

1、创建消息队列

     在使用一个消息队列前,需要使用msgget函数创建该消息队列,其函数声明:

     extern int magget(key_t _key,int _msgflg) _THROW;

     第一个参数key由ftok创建的key值;

     第二个参数_msgflg的低位用来确定消息队列的访问权限。

2、发送消息到消息队列

     extern int msgsnd(int _msqid , _const void * _msgq, size_t _msgsz , int _msgflg );

     第一个参数msgid为指定的消息队列标识符(由msgget生成的消息队列标识符),即将消息添加到哪个消息队列中。

     第二个参数msgq为指向的用户定义缓冲区。

     第三个参数为接收消息的大小,其数据类型为:size_t,即unsigned int类型。其大小为0到系统对消息队列的限制值。

     第四个参数用来执行在达到系统为消息队列所定的界限(如达到字数限制)时应采取的操作。

3、从消息队列接收信息

    extern int msgrcv(int _msgid, void * _msgq,size_t _msgsz,long int _msgtyp,int _msgflg);

    第一个参数为读的对象,即从哪个消息队列获取信息。

    第二个参数为一个临时消息数据结构,用来保存读取的信息。

 

现在,利用fork函数,创建一个子进程,并在子进程中利用消息队列的方式发送信息,在父进程中,接收消息。

 

/***************************************************************************
 *            fork.c
 *
 *  Tue Nov 29 16:04:18 2011
 *  Copyright  2011  cluster
 *  <cluster@<host>>
 ****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct msg_st                    //消息队列的结构体
{
	int my_msg_type;
	char msg_text[BUFSIZ];
};
int main(int argc,char **argv)
{
	pid_t pid;
	int i = 1;
	int status;


	if( (pid = fork()) == -1)
	{
		perror("fork");
		exit(EXIT_FAILURE);
	}

	else if ( pid == 0)                //子进程
	{
		struct msg_st some_data;
		int msgid;
		char buffer[BUFSIZ];

		if((msgid = msgget((key_t)12345,0666|IPC_CREAT)) == -1 )
		{
			perror("msgget");
			exit(EXIT_FAILURE);
		}
	
		printf("Enter the mssage to send:");
		fgets(buffer,BUFSIZ,stdin);
		some_data.my_msg_type = 1;
		strcpy(some_data.msg_text,buffer);
	
		if((msgsnd(msgid,(void *) &some_data,MAX_TEXT,0)) == -1)			
		{
			perror("msgsnd");
			exit(EXIT_FAILURE);
		}			
		return 0;
	}
	else                             //父进程
	{	
		int msgid1;
		struct msg_st some_data1;
		int msg_to_recevie = 0;

		if((msgid1= msgget((key_t)12345,0666|IPC_CREAT)) == -1)
		{
			perror("msgget");
			exit(EXIT_FAILURE);
		}		
		if(msgrcv(msgid1,(void *) & some_data1,BUFSIZ,msg_to_recevie , 0) == -1)
		{
			perror("msgrcv");
			exit(EXIT_FAILURE);
		}

		printf("recevier mssage : %s",some_data1.msg_text);
		if(msgctl(msgid1,IPC_RMID,0) == -1)
		{
			fprintf(stderr,"msgctl(IPC_RMID) failed \n");
			exit(EXIT_FAILURE);
		}	
		return 0;
	}
}
   

C语言进程间通信--消息队列

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文地址: http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)
  马上过年了,心里万般滋味。。。    一,消息队列 1,概念:“消息队列”是在消息的传输过程
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管
【3】消息队列(报文队列) (1)概述 消息队列是在消息传递过程中保存消息的容器。它是一种以链表式
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管
消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号
前几天在计算机操作系统课中学习了Linux下进程通信,今日做了个消息队列通信的简单小程序,权当练习
消息队列 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。在某个进程往一个队列写入消
转自http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/, 作者:郑彦兴 消息队列(也叫做报
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号