1>思维导图
1> 使用消息队列完成两个进程间相互通信
#include<myhead.h>
//定义一个消息类型
struct msgbuf
{
long mtype; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建子进程
pid_t pid=fork();
//在父进程实现读功能
if(pid>0)
{
//1、创建key值
key_t key = 0;
if((key=ftok("/", 'k')) == -1)
{
perror("ftok error");
return -1;
}
//2、根据key值创建一个消息队列
int msqid = -1;
if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
//定义一个消息
struct msgbuf rbuf;
while(1)
{
//清空容器
bzero(rbuf.mtext, sizeof(rbuf.mtext));
//只接受类型1
msgrcv(msqid, &rbuf, MSGSIZE, 1, 0);
printf("收到消息为:%s\n", rbuf.mtext);
if(strcmp(rbuf.mtext, "quit")==0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) !=0)
{
perror("msgctl error");
return -1;
}
}
//在子进程实现写功能
if(pid==0)
{
//1、创建key值
key_t key = 0;
if((key=ftok("/", 'k')) == -1)
{
perror("ftok error");
return -1;
}
//2、根据key值创建一个消息队列
int msqid = -1;
if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
//定义一个消息
struct msgbuf sbuf;
while(1)
{
//清空正文的容器
bzero(sbuf.mtext, sizeof(sbuf.mtext));
sbuf.mtype=2;
printf("请输入消息正文:");
fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);
sbuf.mtext[strlen(sbuf.mtext)-1] = 0;
//将消息存放入队列中
msgsnd(msqid, &sbuf, MSGSIZE, 0);
printf("发送成功\n");
if(strcmp(sbuf.mtext, "quit")==0)
{
break;
}
}
}
return 0;
}
#include<myhead.h>
//定义一个消息类型
struct msgbuf
{
long mtype; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建子进程
pid_t pid=fork();
//在父进程实现读功能
if(pid>0)
{
//1、创建key值
key_t key = 0;
if((key=ftok("/", 'k')) == -1)
{
perror("ftok error");
return -1;
}
//2、根据key值创建一个消息队列
int msqid = -1;
if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
//定义一个消息
struct msgbuf rbuf;
while(1)
{
//清空容器
bzero(rbuf.mtext, sizeof(rbuf.mtext));
//只接受类型2
msgrcv(msqid, &rbuf, MSGSIZE, 2, 0);
printf("收到消息为:%s\n", rbuf.mtext);
if(strcmp(rbuf.mtext, "quit")==0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) !=0)
{
perror("msgctl error");
return -1;
}
}
//在子进程实现写功能
if(pid==0)
{
//1、创建key值
key_t key = 0;
if((key=ftok("/", 'k')) == -1)
{
perror("ftok error");
return -1;
}
//2、根据key值创建一个消息队列
int msqid = -1;
if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
//定义一个消息
struct msgbuf sbuf;
while(1)
{
//清空正文的容器
bzero(sbuf.mtext, sizeof(sbuf.mtext));
sbuf.mtype=1;
printf("请输入消息正文:");
fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);
sbuf.mtext[strlen(sbuf.mtext)-1] = 0;
//将消息存放入队列中
msgsnd(msqid, &sbuf, MSGSIZE, 0);
printf("发送成功\n");
if(strcmp(sbuf.mtext, "quit")==0)
{
break;
}
}
}
return 0;
}