IO第6天

发布时间:2023年12月20日

实现AB进程对话

A进程发送一句话后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印b。重复上述步骤。直到AB接收或者发送完quit后,结束AB进程

使用消息队列实现

//A文件
#include <myhead.h>

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

int main(int argc, const char *argv[])
{
	//创建key
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	
	//找到或创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid<0){
		perror("msgget");
		return -1;
	}
	system("ipcs -q");

	//准备数据
	struct msgbuf snd;
	struct msgbuf rcv;
	while(1){
		//写
		printf("请输入消息类型>>>");
		scanf("%ld",&snd.mtype);
		getchar();

		printf("请输入消息内容>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1]='\0';

		//发送消息
		if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0){
			perror("msgsnd");
			break;
		}
		if(strcmp(snd.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("发送成功\n");

		//读	
		if(msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,0)<0){
			perror("msgrcv");
			break;
		}
		if(strcmp(rcv.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("mtype=%ld mtext=%s\n",rcv.mtype,rcv.mtext);
	}

	//关闭消息队列
	if(msgctl(msgid,IPC_RMID,NULL)<0){
		perror("msgctl");
		return -1;
	}
	system("ipcs -q");

	return 0;
}
//B文件
#include <myhead.h>

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

int main(int argc, const char *argv[])
{
	//创建key
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	
	//找到或创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid<0){
		perror("msgget");
		return -1;
	}

	//准备数据
	struct msgbuf snd;
	struct msgbuf rcv;
	while(1){
		//读
		if(msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,0)<0){
			perror("msgrcv");
			break;
		}

		if(strcmp(rcv.mtext,"quit")==0){
			printf("退出\n");
			break;
		}                                    
		printf("mtype=%ld mtext=%s\n",rcv.mtype,rcv.mtext);

		//写
		printf("请输入消息类型>>>");
		scanf("%ld",&snd.mtype);
		getchar();

		printf("请输入消息内容>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1]='\0';

		//发送消息
		if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0){
			perror("msgsnd");
			break;
		}
		if(strcmp(snd.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("发送成功\n");
	}
	
	//关闭消息队列
	if(msgctl(msgid,IPC_RMID,NULL)<0){
		perror("msgctl");
		return -1;
	}
	system("ipcs -q");


	return 0;
}

?

要求在共享内存中存入字符串“1234567”。

A进程循环打印字符串,B进程循环倒置字符串,要求结果不允许出现乱序:

提示:共享内存+信号灯集

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