使用消息队列完成两个进程之间相互通信
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.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 = ftok("/", 'k');if(key == -1){perror("key create error");return -1;}//此时key已经创建出来printf("key = %#x\n", key);//2、创建消息队列int msgid = msgget(key, IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}printf("msgid = %d\n", msgid); //输出消息队列id号struct msgbuf buf;//需要创建两个进程,父进程从管道1中读数据,子进程向管道2中写数据pid_t pid = -1;pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程负责向中写数据while(1){//输入消息内容printf("请输入您要发送的类型:");scanf("%ld", &buf.mtype);printf("请输入消息内容:");scanf("%s", buf.mtext);//将消息放入消息队列中msgsnd(msgid, &buf, SIZE, 0);//判断退出条件if(strcmp(buf.mtext, "quit") == 0){break;}}}else{//父进程负责向消息队列中读数据//3、向消息队列中存放数据while(1){//将消息从消息队列中读取出来msgrcv(msgid, &buf, SIZE, 10, 0);//参数1:消息队列id//参数2:容器起始地址//参数3:消息正文大小//参数4:要读取的消息类型//参数5:是否阻塞//将读取的消息打印出来printf("收到消息:%s\n", buf.mtext);}}//4、删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.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 = ftok("/", 'k');if(key == -1){perror("key create error");return -1;}//此时key已经创建出来printf("key = %#x\n", key);//2、创建消息队列int msgid = msgget(key, IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}printf("msgid = %d\n", msgid); //输出消息队列id号struct msgbuf buf;//需要创建两个进程,父进程从管道1中读数据,子进程向管道2中写数据pid_t pid = -1;pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程负责向中读数据while(1){//将消息从消息队列中读取出来msgrcv(msgid, &buf, SIZE, 9,0);//参数1:消息队列id//参数2:容器起始地址//参数3:消息正文大小//参数4:要读取的消息类型//参数5:是否阻塞//将读取的消息打印出来printf("收到消息:%s\n", buf.mtext);}}else{//父进程负责向消息队列中写数据//3、向消息队列中存放数据while(1){//输入消息内容printf("请输入您要发送的类型:");scanf("%ld", &buf.mtype);printf("请输入消息内容:");scanf("%s", buf.mtext);//将消息放入消息队列中msgsnd(msgid, &buf, SIZE, 0);//判断退出条件if(strcmp(buf.mtext, "quit") == 0){break;}}}//4、删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}
运行效果:
思维导图