IO作业7.0

发布时间:2024年01月09日

思维导图

使用消息队列完成两个进程之间相互通信

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
	long mtybe; 	//消息类型
	char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))

int main(int argc, const char *argv[])
{
	//定义进程号
	pid_t pid;
	//1、创建key值
	key_t key = 0;
	if((key = ftok("/",'t')) == -1)
	{
		perror("fork error");
		return -1;
	}
	//2、使用key创建一个消息队列
	int msqid = 0;
	if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
	{
		perror("msgget error");
		return -1;
	}
	pid=fork();
	if(pid>0){
		//定义一个消息类型的容器
		struct msgbuf buf = {.mtybe=2};
		//3、循环向队列中存放数据
		while(1)
		{
			printf("请输入存放的数据:");
			scanf("%s",buf.mtext);
			getchar(); 			//吸收回车
			//将消息存放到消息队列中
			msgsnd(msqid,&buf,SIZE,0);
			printf("发送成功\n");
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}

	}
	else if(pid == 0)
	{
		//定义一个消息类型的容器
		struct msgbuf buf={.mtybe=1};
		//3、循环向队列中存放数据
		while(1)
		{
			//从消息队列中读取消息
			msgrcv(msqid,&buf,SIZE,1,0);
			//第一个0表示无视类型,每次都取第一个消息
			//第二个0表示阻塞形式接受消息
			printf("收到的消息为:%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	else 
	{
		perror("fork error");
		return -1;
	}
	wait(NULL);

	return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
	long mtybe; 	//消息类型
	char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))

int main(int argc, const char *argv[])
{
	//定义进程号
	pid_t pid;
	//1、创建key值
	key_t key = 0;
	if((key = ftok("/",'t')) == -1)
	{
		perror("fork error");
		return -1;
	}
	//2、使用key创建一个消息队列
	int msqid = 0;
	if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
	{
		perror("msgget error");
		return -1;
	}
	pid=fork();
	if(pid>0){
		//定义一个消息类型的容器
		struct msgbuf buf={.mtybe=2};
		//3、循环向队列中存放数据
		while(1)
		{
			//从消息队列中读取消息
			msgrcv(msqid,&buf,SIZE,2,0);
			//第一个0表示无视类型,每次都取第一个消息
			//第二个0表示阻塞形式接受消息
			printf("收到的消息为:%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}

	}
	else if(pid == 0)
	{
		//定义一个消息类型的容器
		struct msgbuf buf = {.mtybe=1};
		//3、循环向队列中存放数据
		while(1)
		{
			printf("请输入存放的数据:");
			scanf("%s",buf.mtext);
			getchar(); 			//吸收回车
			//将消息存放到消息队列中
			msgsnd(msqid,&buf,SIZE,0);
			printf("发送成功\n");
			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}
	wait(NULL);
	//4、删除消息队列
	if(msgctl(msqid,IPC_RMID,NULL)==-1)
	{
		perror("msgctl error");
		return -1;
	}


	return 0;
}

文章来源:https://blog.csdn.net/mmj12/article/details/135490653
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。