5.11 消息队列应用:点对点通信

1、实验代码
client1.c

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

#define handle_error(msg) \
    {perror(msg);exit(EXIT_FAILURE);}

#define MSG_TYPE1 1
#define MSG_TYPE2 2

struct msgbuf
{
	long mtype;
	char mtext[80];
};

int main (int argc, char *argv[])
{
//	key_t key = ftok (".", 511);
	key_t key = 511;
	int msg_id = msgget (key, IPC_CREAT | 0666);
	struct msgbuf msg1, msg2;

	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
        handle_error("fork")
	else if (ret_from_fork == 0)
	{
		while (1)
		{
			gets (msg1.mtext);
			msg1.mtype = MSG_TYPE1;
			msgsnd (msg_id, &msg1, 80, 0);
		}
	}
	else
	{
		while (1)
		{
			memset (&msg2, 0, sizeof(msg2));
			if (msgrcv (msg_id, (void *)&msg2, \
                        sizeof(msg2.mtext), MSG_TYPE2, 0) == -1)
			    handle_error("msgrcv");
            printf ("client2: %s\n", msg2.mtext);
		}
	}
	msgctl (msg_id, IPC_RMID, NULL);
	return 0;
}

client2.c

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

#define handle_error(msg) \
    {perror(msg);exit(EXIT_FAILURE);}

#define MSG_TYPE1 1
#define MSG_TYPE2 2

struct msgbuf
{
	long mtype;
	char mtext[80];
};

int main (void)
{
//	key_t key = ftok (".", 511);
	key_t key = 511;
	int msg_id = msgget (key, IPC_CREAT | 0666);
	struct msgbuf msg1, msg2;

	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
        handle_error("fork")
	else if (ret_from_fork == 0)
	{
		while (1)
		{
			gets (msg2.mtext);
			msg2.mtype = MSG_TYPE2;
			msgsnd (msg_id, &msg2, 80, 0);
		}
	}
	else
	{
		while (1)
		{
			memset (&msg1, 0, sizeof(msg1));
			if (msgrcv(msg_id, (void *)&msg1, \
                       sizeof(msg1.mtext), MSG_TYPE1, 0) == -1)
			    handle_error("msgrcv");
            printf ("client1: %s\n", msg1.mtext);
		}
	}
	return 0;
}

2、实验结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值