作业:使用消息队列完成两个进程间相互通信
要求用消息队列实现AB进程对话: A进程先发送一句话给B进程,B进程接收后打印
B进程再回复一句话给A进程,A进程接收后打印, 重复1.2步骤,当收到quit后,要结束AB进程
实现随时收发:用多进程多线程
#include <myhead.h>
//消息结构体
typedef struct
{
long msgtype; //消息类型
char data[1024]; //消息正文
}Msg_ds;
#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小
int main(int argc, const char *argv[])
{
//1、创建key值
key_t key;
if((key=ftok("/",'k'))==-1)
{
perror("ftork error");
return -1;
}
//2、创建消息队列
int msqid;
if((msqid = msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
pid_t pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
//向消息队列中取出数据
Msg_ds msg;
while(1)
{
if(msgrcv(msqid,&msg,SIZE,200,0)==-1)
{
perror("msgrcv error");
return -1;
}
if(strcmp(msg.data,"quit")==0)
{
break;
}
printf("rcv:%s\n",msg.data);
}
}else
{
//3、向消息队列中发送数据
Msg_ds msg={.msgtype=100};
while(1)
{
printf("请输入消息内容:\n");
fgets(msg.data,sizeof(msg.data),stdin);
msg.data[strlen(msg.data)-1]='\0';
//将消息发送到消息队列中
if(msgsnd(msqid,&msg,SIZE,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(strcmp(msg.data,"quit")==0)
{
break;
}
}
wait(NULL);
}
return 0;
}
#include <myhead.h>
//消息结构体
typedef struct
{
long msgtype; //消息类型
char data[1024]; //消息正文
// char name[10];
}Msg_ds;
#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小
int main(int argc, const char *argv[])
{
//1、创建key值
key_t key;
if((key=ftok("/",'k'))==-1)
{
perror("ftork error");
return -1;
}
//2、创建消息队列
int msqid;
if((msqid = msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
//创建一个子进程
pid_t pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
//向消息队列中取出数据
Msg_ds msg;
while(1)
{
if(msgrcv(msqid,&msg,SIZE,100,0)==-1)
{
perror("msgrcv error");
return -1;
}
if(strcmp(msg.data,"quit")==0)
{
break;
}
printf("rcv:%s\n",msg.data);
}
}else if(pid>0)
{
//3、向消息队列中发送数据
Msg_ds msg={.msgtype=200};
while(1)
{
printf("请输入消息内容:\n");
fgets(msg.data,sizeof(msg.data),stdin);
msg.data[strlen(msg.data)-1]='\0';
//将消息发送到消息队列中
if(msgsnd(msqid,&msg,SIZE,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(strcmp(msg.data,"quit")==0)
{
break;
}
}
wait(NULL);
}
return 0;
}