Day19 第6站 谜?进程通信的新姿态参战 !消队、共存!

#include <myhead.h>
#define SIZE sizeof(struct msgbuf)-sizeof(long)
struct msgbuf//容器
{
	long mtype;
	char mtext[1024];
};
int main(int argc, const char *argv[])
{
	key_t key=ftok("/",'k');//成才
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	key_t son=ftok("/",'s');//许三多
	if(son==-1)
	{
		perror("ftok");
		return -1;
	}

	printf("我拿到钥匙%#x\n",key);
	int msgqid= msgget(key,IPC_CREAT|0664);//创造或进入钢七连
	if(msgqid==-1)
	{
		perror("msgqid");
		return -1;
	}
	int msgqiq= msgget(son,IPC_CREAT|0664);//创造或进入草原五班
	if(msgqid==-1)
	{
		perror("msgqiq");
		return -1;
	}
printf("魔童降世\n");
	struct msgbuf buf;//指导员

	pid_t pid=fork();//不要管老爹了
	if(pid>0)
	{
		while(1)
		{
		printf("请输入类型>>>");//有一个道理不用讲,老师讲过的我不讲
		scanf("%ld",&buf.mtype);
		getchar();
		printf("请输入消息>>>");
		fgets(buf.mtext,SIZE,stdin);
		buf.mtext[strlen(buf.mtext)-1]=0;
		msgsnd(msgqid,&buf,SIZE,0);//许三多你做腹部绕杠
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
		printf("发送成功\n");
		}
	}
	else if(pid==0)
	{
		while(1)
		{
			msgrcv(msgqiq,&buf,SIZE,0,0);//收到马班长命令,开始铺路
			putchar(10);
			printf("收到消息>>>");
			printf("%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit")==0)//功成名就,告老还乡
			{
				break;
			}
		}
	if(msgctl(msgqiq,IPC_RMID,NULL)==-1)//草原五班解散
	{
		perror("msgctl");
		return -1;
	}
	printf("删除成功\n");
	exit(EXIT_SUCCESS);
	}
	waitpid(-1,NULL,WNOHANG);
	return 0;
}

#include <myhead.h>
#define SIZE sizeof(struct msgbuf)-sizeof(long)
struct msgbuf//容器
{
	long mtype;
	char mtext[1024];
};
int main(int argc, const char *argv[])
{
	key_t key=ftok("/",'k');//成才
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	key_t son=ftok("/",'s');//许三多
	if(son==-1)
	{
		perror("ftok");
		return -1;
	}
	printf("钥匙在手%#x\n",key);
	struct msgbuf buf;
	int msgqid=msgget(key,IPC_CREAT|0664);//史班长带我走吧
	if(msgqid==-1)
	{
		perror("pid");
		return -1;
	}
	int msgqiq= msgget(son,IPC_CREAT|0664);//这个兵我要你了
	if(msgqiq==-1)
	{
		perror("msgqiq");
		return -1;
	}
	printf("魔童僵尸\n");
	pid_t pid=fork();//孩子你去吧
	if(pid==-1)
	{
		perror("fork");
		return -1;
	}
	if(pid>0)
	{
		while(1)//好好活 有意义
		{
			msgrcv(msgqid,&buf,SIZE,0,0);//钢七连收到命令
			putchar(10);
			printf("收到消息>>>");
			printf("%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit")==0)
			{
				break;
			}
		}
		if(msgctl(msgqid,IPC_RMID,NULL)==-1)//钢七连原地解散不抛弃不放弃
		{
			perror("msgctl");
			return -1;
		}
	printf("删除成功\n");
	}
	else if(pid==0)
	{
		while(1)
			{
			printf("请输入类型>>>");
			scanf("%ld",&buf.mtype);
			getchar();
			printf("请输入消息>>>");
			fgets(buf.mtext,SIZE,stdin);
			buf.mtext[strlen(buf.mtext)-1]=0;
			msgsnd(msgqiq,&buf,SIZE,0);//许三多 我命令你去铺路
			if(strcmp(buf.mtext,"quit")==0)
			{
				break;
			}
			printf("发送成功\n");
			}
		exit(EXIT_SUCCESS);
	}
	waitpid(-1,NULL,WNOHANG);
	return 0;
}


2.
#include <myhead.h>
int main(int argc, const char *argv[])
{
	key_t key = ftok("/",'t');//我有对象了!
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmid =shmget(key,PAGE_SIZE,IPC_CREAT|0664);//带对象回家
	if(shmid==-1)
	{
		perror("shmget");
		return -1;
	}
	printf("%d\n",shmid);

	char *addr = (char *)shmat(shmid,NULL,0);//入乡随俗
	char arr[128]="";
	printf("adrr=%p\n",addr);
	while(1)
	{
	printf("请输入>>>");
	fgets(arr,sizeof(arr),stdin);
	arr[strlen(arr)-1]=0;
	strcpy(addr,arr);//给孩子塞点红包
	if(strcmp(addr,"quit")==0)
	{
		break;
	}
	}
	if(shmdt(addr)==-1)//你说你想要自由 爱过了就不遗憾
	{
		perror("addr");
		return -1;
	}
	
	return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
	key_t key = ftok("/",'t');//我也找到对象了
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmid =shmget(key,PAGE_SIZE,IPC_CREAT|0664);//给宝宝一个家
	if(shmid==-1)
	{
		perror("shmget");
		return -1;
	}
	printf("%d\n",shmid);

	char *addr = (char *)shmat(shmid,NULL,O_RDONLY);//过门了
	printf("adrr=%p\n",addr);
	char arr[128]="";
	while(1)
	{
	usleep(100000);

	if(strcmp(addr,"quit")==0)
	{
		break;
	}
	if(strcmp(addr,arr)!=0)
	{
	printf("消息为:%s\n",addr);//让我看看你的真面目
	}
	strcpy(arr,addr);
	}
	if(shmdt(addr)==-1)//燕子 还会再见面吗
	{
		perror("shmdt");
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,NULL)==-1)//对不起 下辈子永远在一起
	{
		perror("shmctl");
		return -1;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值