8.6 A B进程消息队列互相通信+共享内存的读写

题目一

要求AB进程做通信
1.A进程发送一句话,B进程接收打印
2.然后B进程发送给A进程一句话,A进程接收打印
3.重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
4.在上面基础上实现,AB进程能够随时收发数据

代码示例

A进程
typedef struct msgbuf{
	long mtype;
	char mtext[128];
}msgbuf;
int msqid;
//A发送
void* A_SND(void *arg)
{
	msgbuf snd = *(msgbuf*)arg;

	while(1)
	{
		//A输入
		printf("A进程输入>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1] = '\0';
		if(msgsnd(msqid,&snd,sizeof(snd.mtext),0) <0 )
		{
			perror("msgsnd");
			break;
		}
		printf("A进程消息发送成功\n");
		if(strcmp(snd.mtext,"quit")==0)
			exit(0);
	}
	pthread_exit(NULL);
}
//A接收
void* A_RCV(void *arg)
{
	msgbuf rcv = *(msgbuf*)arg;
	ssize_t res;
	while(1)
	{
		//A接收
		res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),2,0);
		if(res < 0)
		{
			perror("msgrcv");
			break;
		}
		printf("\rA收到B进程的消息:%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
			exit(0);
		printf("A进程输入>>>");
		fflush(stdout);
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//计算key值
	key_t key = ftok("./",1);
	if(key < 0)
	{
		perror("fork");
		return -1;
	}

	//创建一个消息队列
	msqid = msgget(key,IPC_CREAT|0664);
	if(msqid < 0)
	{
		perror("msgget");
		return -1;
	}
	msgbuf rcv;
	
	msgbuf snd;
	snd.mtype=1;
	//创建线程
	pthread_t tid1,tid2;
	//发送线程
	if(pthread_create(&tid1,NULL,A_SND,(void*)&snd) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	//接收线程
	if(pthread_create(&tid2,NULL,A_RCV,(void*)&rcv) != 0)
	{
		perror("pthread_create");
		return -1;
	}

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	return 0;
}

B进程
typedef struct msgbuf{
	long mtype;
	char mtext[128];
}msgbuf;
int msqid; 
//B发送
void* B_SND(void *arg)
{
	msgbuf snd = *(msgbuf*)arg;
	while(1)
	{
		//B输入
		printf("B进程输入>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1] = '\0';
		if(msgsnd(msqid,&snd,sizeof(snd.mtext),0) <0 )
		{
			perror("msgsnd");
		}
		printf("B进程消息发送成功\n");
		if(strcmp(snd.mtext,"quit")==0)
			exit(0);
	}
	pthread_exit(NULL);
}
//B接收
void* B_RCV(void *arg)
{
	msgbuf rcv = *(msgbuf*)arg;
	ssize_t res;
	while(1)
	{
		//B接收
		res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),1,0);
		if(res < 0)
		{
			perror("msgrcv");
			break;
		}
		printf("\rB收到A进程的消息:%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
			exit(0);
		printf("B进程输入>>>");
		fflush(stdout);

	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//计算key值
	key_t key = ftok("./",1);
	if(key < 0)
	{
		perror("fork");
		return -1;
	}
	//创建一个消息队列
	msqid = msgget(key,IPC_CREAT|0664);
	if(msqid < 0)
	{
		perror("msgget");
		return -1;
	}
	msgbuf snd;
	snd.mtype = 2;

	msgbuf rcv;
	//ssize_t res;
	//创建线程
	pthread_t tid1,tid2;
	//接收线程
	if(pthread_create(&tid2,NULL,B_RCV,(void*)&rcv) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	//发送线程
	if(pthread_create(&tid1,NULL,B_SND,(void*)&snd) != 0)
	{
		perror("pthread_create");
		return -1;
	}

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	return 0;
}

测试结果

在这里插入图片描述

题目二

  1. A进程写入一个整型,在该整型后,写入一个字符串
  2. B进程将共享内存中的整型以及字符串读取出来;

代码示例

A进程
int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'a');
	if(key < 0)
	{
		perror("ftok");
		return -1;
	}
	int shmid = shmget(key,32,IPC_CREAT|0664);
	if(shmid < 0)
	{
		perror("shmget");
		return -1;
	}
	void* shmaddr =  shmat(shmid,NULL,0);
	if((void*)-1 == shmaddr)
	{
		perror("shmat");
		return -1;
	}
	int *pta = (int*)shmaddr;
	printf("请输入一个整型>>>");
	int a;
	scanf("%d",&a);
	*pta = a;
	printf("请输入一个字符串>>>");
	char str[32] = "";
	getchar();
	fgets(str,sizeof(str),stdin);
	str[strlen(str)-1] = '\0';
	strcpy((char*)(pta+1),str);
	return 0;
}
B进程
int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'a');
	if(key < 0)
	{
		perror("ftok");
		return -1;
	}

	int shmid = shmget(key,32,IPC_CREAT|0664);
	if(shmid < 0)
	{
		perror("shmget");
		return -1;
	}
	void* shmaddr =  shmat(shmid,NULL,0);
	if((void*)-1 == shmaddr)
	{
		perror("shmat");
		return -1;
	}
	int *pta = (int*)shmaddr;
	printf("%d\n",*pta);
	printf("%s\n",(char*)(pta+1));
	return 0;
}

测试结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知名社畜L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值