IPC--消息队列 message queue(消息队列的创建,信息的发送和接收)

注意 :在消息得发送和接受时,可能会重置errno的值,如果发送和接受函数返回-1,要检查errno来确定具体的出错信息

消息的发送


#include <stdio.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#define KEY 0x1234
/*
 * step 1 : 自定义msgbuf结构(存放消息的类型和数据本身),类比与msg.h中的struct msgbuf
 * 要求 message type 必须是long类型 ,
 * 数据可以自定义为任何类型,并且对数据变量的数量没有要求
 */
struct mymsg {
	long mtype;
	char data[1024];
};
int main(int argc, char **argv) {

	int msqid;

	//step 2 : 初始化msg变量 存放消息信息
	struct mymsg msg;

	//step 3 : 打开(创建)消息队列对象 ,KEY是消息队列的关键字(16进制数),
	//成功返回消息队列ID,失败返回-1
	if ((msqid = msgget(KEY, 0666 | IPC_CREAT)) < 0) {
		fprintf(stderr, "get message queue %X failed\n", KEY);
		exit(1);
	}

	while (strncmp(msg.data, "exit", 4)) {
		memset(&msg, 0, sizeof(msg));
		//从标准输入获得消息数据
		msg.mtype = getpid();
		fgets(msg.data, sizeof(msg.data), stdin);
		/*
		 * 发送消息msg到消息队列msqid,消息长度是消息数据长度
		 * 成功返回0;失败返回 -1 ;errno被置为相应的值
		 */
		while (msgsnd(msqid, &msg, strlen(msg.data), 0) < 0) {
			//step 4 :发送判断
			if (errno == EINTR) {
				continue;
			} else {
				fprintf(stderr, "send message error!");
				exit(1);
			}
		}

	}

	return 
消息的接收

#include <stdio.h>
#include <sys/msg.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

//接受消息队列信息
//自定义消息结构,与发送的消息结构相对应
struct mymsg {
	long mtype;
	char data[1024];
};
int main(int argc, char **argv) {
	struct mymsg msg;

	int msqid;
	int result;
	/*
	 * 打开(创建)KEY为0x1234的消息队列,成功返回消息队列得ID,失败返回-1
	 */
	if ((msqid = msgget(0x1234, 0666 | IPC_CREAT)) < 0) {
		fprintf(stderr, "open message queue %X error", 0x1234);
		exit(1);
	}

	while (strncmp(msg.data, "exit", 4)) {
		//清空msg内存,进行初始化
		memset(&msg, 0, sizeof(msg));

		while ((result = msgrcv(msqid, &msg, sizeof(msg), 0, 0)) < 0) {
			if (errno == EINTR) {
				continue;
			} else {
				perror("msgrcv");
				exit(1);
			}
		}

		fprintf(stderr, "Message from msqid=%d , size=%d,type=%ld,data=%s\n",
				msqid, result, msg.mtype, msg.data);
	}
	return 0;
}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值