使用消息队列完成两个进程间相互通信
#include <myhead.h>
#define SIZE sizeof(Msg_buf)-sizeof(long)
//定义消息队列数据的结构体
typedef struct
{
long mtype;
char mdata[1024];
}Msg_buf;
int main(int argc, const char *argv[])
{
//1创建一个key值
key_t key;
if(key=ftok("/",'a')==-1)
{
perror("ftor error");
return -1;
}
//2创建一个消息队列
int id=msgget(key,IPC_CREAT|0664);
if(id==-1)
{
perror("msgget error");
return -1;
}
//定义一个子进程
pid_t pid;
pid=fork();
if(pid>0)
{
//这是父进程
//3、向消息队列中发送数据
Msg_buf msg1={.mtype=28};
while(1)
{
printf("请输入内容");
fgets(msg1.mdata,sizeof(msg1.mdata),stdin);
msg1.mdata[strlen(msg1.mdata)-1]='\0';
//发送消息
if(msgsnd(id,&msg1,SIZE,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(strcmp(msg1.mdata,"quit")==0)
{
break;
}
}
//等待回收子进程
wait(NULL);
}else if(pid==0)
{
//这是子进程
//读取数据消息
Msg_buf msg;
while(1)
{
//接收消息
if(msgrcv(id,&msg,SIZE,128,0)==-1)
{
perror("msgrcv error");
return -1;
}
if(strcmp(msg.mdata,"quit")==0)
{
break;
}
printf("从对方那边接收到的内容:");
printf("%s\n",msg.mdata);
}
//删除消息队列
msgctl(id,IPC_RMID,NULL);
//子进程退出
// exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
return 0;
}
#include <myhead.h>
#define SIZE sizeof(Msg_buf)-sizeof(long)
//定义消息队列数据的结构体
typedef struct
{
long mtype;
char mdata[1024];
}Msg_buf;
int main(int argc, const char *argv[])
{
//1创建一个key值
key_t key;
if(key=ftok("/",'a')==-1)
{
perror("ftor error");
return -1;
}
//2创建一个消息队列
int id=msgget(key,IPC_CREAT|0664);
if(id==-1)
{
perror("msgget error");
return -1;
}
//定义一个子进程
pid_t pid;
pid=fork();
if(pid>0)
{
//这是父进程
//3、向消息队列中发送数据
Msg_buf msg={.mtype=128};
while(1)
{
printf("请输入内容");
fgets(msg.mdata,sizeof(msg.mdata),stdin);
msg.mdata[strlen(msg.mdata)-1]='\0';
//发送消息
if(msgsnd(id,&msg,SIZE,0)==-1)
{
perror("msgsnd error");
return -1;
}
if(strcmp(msg.mdata,"quit")==0)
{
break;
}
}
//等待回收子进程
wait(NULL);
}else if(pid==0)
{
//这是子进程
//读取数据消息
Msg_buf msg1;
while(1)
{
//接收消息
if(msgrcv(id,&msg1,SIZE,28,0)==-1)
{
perror("msgrcv error");
return -1;
}
if(strcmp(msg1.mdata,"quit")==0)
{
break;
}
printf("从对方那边接收到的内容:");
printf("%s\n",msg1.mdata);
}
//删除消息队列
msgctl(id,IPC_RMID,NULL);
//子进程退出
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
return 0;
}
思维导图