C语言消息队列实现进程间通信的实现方法

消息队列就是由内核负责管理的一个管道,可以按顺序发送消息包(消息类型+消息内容),可以全双工工作,可以不按消息的顺序接收消息。
int msgget(key_t key, int msgflg);
功能:创建/获取消息队列
key:IPC键值,由ftok函数自动生成
msgflg:
0 获取消息队列
IPC_CREAT 创建消息队列
IPC_EXCL 如果存在则创建失败
返回值:消息队列标识
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列发送消息
msqid:消息队列标识,msgget函数的返回值
msgp:结构指针
struct msgbuf {
long mtype; //消息类型
char mtext[n]; //消息内容
};
msgsz:消息的长度,不包括消息类型,sizeof(msgbuf)-4。
msgflg:
0 阻塞,当消息队列满时,等待。
IPC_NOWAIT 不阻塞,当消息队列满时,不等待。
返回值:成功发送返回0,失败返回-1。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "struct.h"

int main()
{
	// 创建消息队列
	int msgid = msgget(ftok(".",119),IPC_CREAT|0644);
	if(0 > msgid)
	{
		perror("msgget");
		return -1;
	}

	Msg msg = {111};
	for(;;)
	{
		printf(">");
		gets(msg.data);
		msgsnd(msgid,&msg,sizeof(Msg)-sizeof(msg.type),0);
		if(0 == strcmp("quit",msg.data))
		{
			printf("通信结束!\n");
			break;
		}
	}

	if(0 > msgctl(msgid,IPC_RMID,NULL))
	{
		perror("msgctl");
	}
}

步骤一、创建消息队列int msgid = msgget(ftok(".",119),IPC_CREAT|0644);
步骤二、发送消息msgsnd(msgid,&msg,sizeof(Msg)-sizeof(msg.type),0);
步骤三、删除消息队列if(0 > msgctl(msgid,IPC_RMID,NULL));

你可能感兴趣的:(C,消息通信)