日期:2014-05-16 浏览次数:21164 次
消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。与有名管道比起来,消息队列的有点在于独立于发送与接收进程,这减少了在打开与关闭有名管道之间同步的困难。
(2)、分类:功能:从msqid代表的消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结构中;
示例代码, 创建一个消息队列,使两个进程能够通过它实现数据通讯。
读进程代码:创建或打开一个消息队列,并从消息队列中读出消息直至遇到字符串“end”。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
struct my_msg_st
{
    long int my_msg_type;
	char some_text[BUFSIZ];
};
/*
 * 程序入口
 * */
int main(void)
{
    int running=1;
	int msgid;
	struct my_msg_st some_data;
	long int msg_to_receive=0;
	/*创建消息队列*/
	msgid=msgget((key_t)1234,0666 | IPC_CREAT);
	if(msgid==-1)
	{
	    fprintf(stderr,"msgget failed with error: %d\n",errno);
		exit(EXIT_FAILURE);
	}
	
	/*循环从消息队列中接收消息*/
	while(running)
	{
		/*读取消息*/
	    if(msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,0)==-1)
		{
		    fprintf(stderr,"msgrcv failed with error: %d\n",errno);
			exit(EXIT_FAILURE);
		}
		printf("You wrote: %s",some_data.some_text);
		/*接收到的消息为“end”时结束循环*/
		if(strncmp(some_data.some_text,"end",3)==0)
		{
		    running=0;
		}
	}
	/*从系统内核中移走消息队列*/
	if(msgctl(msgid,IPC_RMID,0)==-1)
	{
	    fprintf(stderr,"msgctl(IPC_RMID) failed\n");
		exit(EXIT_FAILURE);
	}
	exit(EXIT_SUCCESS);
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>