10.19日作业

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

进程A

#include <head.h>
//定义结构体
struct msgbuf
{
  long mtype;//消息类型
  char mtext[1024];//正文数据
};
//定义一个正文大小
#define SIZE sizeof(struct msgbuf)-sizeof(long)

int main(int argc, const char *argv[])
{
	//1 创建key值
	key_t key;
	if((key=ftok("./",'k'))==-1)
	{
	  perror("ftol error");
	  return -1;
	}
	//2 通过key值创建消息队列
	int msgid;   ///消息队列号
	if((msgid=msgget(key,IPC_CREAT|0664))==-1)
	{
	  perror("msgget error");
	  return -1;
	}
	//创建一个父子进程
	pid_t cpid=fork();
	//父进程
	if(cpid>0)
	{
	//向消息队列中发送数据
	struct msgbuf info ={.mtype=100};
	while(1)
	{
		//清空里面内容
	  bzero(info.mtext,sizeof(info.mtext));
	  printf("请输入>>");
	  fgets(info.mtext,SIZE,stdin);//从终端读取数据
	  info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为\0
	  //调用发送函数
	  msgsnd(msgid,&info,SIZE,0);
	  //参数1向哪个队列发送数据
	  //参数2:要发送消息的地址
	  //参数3:要发送消息的大小
	  //参数4;阻塞形式发送
	  if(strcmp(info.mtext,"quit")==0)
	  {
	    break;
	  }
	}
	//删除消息队列
/*	if(msgctl(msgid,IPC_RMID,NULL)==-1)
	{
	  perror("msgctl error");
	  return -1;
	}*/
	}
	else if(cpid==0)
	{
	   //从消息队列中读取数据
      struct msgbuf info;//读取存储的数据
      while(1)
      {
          //清空里面内容
       bzero(info.mtext,sizeof(info.mtext));
      
        //调用接受函数
        msgrcv(msgid,&info,SIZE,200,0);
        //参数1向哪个队列发送数据
        //参数2:要发送消息的地址
        //参数3:要发送消息的大小
        //参数4;0表示从队列中读取第一个消息
        //参数5:表示阻塞接受
        printf("%s\n",info.mtext);
            
	  if(strcmp(info.mtext,"quit")==0)
	  {
	    break;
	  } 
	  }
	}
	else
	{
	  perror("fork error");
	  return -1;
	}

	return 0;
}

进程B

#include <head.h>
//定义结构体
struct msgbuf
{
  long mtype;//消息类型
  char mtext[1024];//正文数据
};
//定义一个正文大小
#define SIZE sizeof(struct msgbuf)-sizeof(long)

int main(int argc, const char *argv[])
{
	//1 创建key值
	key_t key;
	if((key=ftok("./",'k'))==-1)
	{
	  perror("ftol error");
	  return -1;
	}
	//2 通过key值创建消息队列
	int msgid;   ///消息队列号
	if((msgid=msgget(key,IPC_CREAT|0664))==-1)
	{
	  perror("msgget error");
	  return -1;
	}
	//创建一个父子进程
	pid_t cpid=fork();
	//子进程
	if(cpid==0)
	{
	//从消息队列中读取数据
	struct msgbuf info;//读取存储的数据
	while(1)
	{
		//清空里面内容
	  bzero(info.mtext,sizeof(info.mtext));
	
	  //调用接受函数
	  msgrcv(msgid,&info,SIZE,100,0);
	  //参数1向哪个队列发送数据
	  //参数2:要发送消息的地址
	  //参数3:要发送消息的大小
	  //参数4;0表示从队列中读取第一个消息
	  //参数5:表示阻塞接受
	  printf("%s\n",info.mtext);
       if(strcmp(info.mtext,"quit")==0)
        {
          break;
        }
	}
	}
	else if(cpid>0)
	{
	   //向消息队列中发送数据
      struct msgbuf info ={.mtype=200};
      while(1)
     {
         //清空里面内容
        bzero(info.mtext,sizeof(info.mtext));
        printf("请输入>>");
        fgets(info.mtext,SIZE,stdin);//从终端读取数据
        info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为\0
        //调用发送函数
        msgsnd(msgid,&info,SIZE,0);
        //参数1向哪个队列发送数据
        //参数2:要发送消息的地址
        //参数3:要发送消息的大小
        //参数4;阻塞形式发送
       if(strcmp(info.mtext,"quit")==0)
        {
          break;
        }
      }  
  //删除消息队列
     /* if(msgctl(msgid,IPC_RMID,NULL)==-1)
      {
        perror("msgctl error");
        return -1;
      }*/
	  }
	else 
	{
	  perror("fork error");
	  return -1;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值