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;
- }