重生之IOday4————多进程通信
使用消息队列实现两个程序的相互通信
s.c如下
#include<my_head.h>struct msgbuf
{long mtype; //消息类型char mtext[1024]; //消息正文
};//宏定义一个消息正文的大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[])
{//创建一个key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error\n");return -1;}//创建一个消息队列int msqid = msgget(key,IPC_CREAT|0664);if(msqid == -1){perror("msgget error");return -1;}printf("s.out:msqid=%d\n",msqid);//创建一个进程pid_t pid = fork();if(pid>0){//父进程struct msgbuf buf;while(1){printf("s.out父进程想要发送的消息类型:");scanf("%ld",&buf.mtype);getchar();printf("请输入想要发送的正文:");fgets(buf.mtext,SIZE,stdin); //终端获取buf.mtext[strlen(buf.mtext)-1] = 0;if(strcmp(buf.mtext,"quit")==0){break;}msgsnd(msqid,&buf,SIZE,0);}}else if(pid == 0){//子进程struct msgbuf buf;while(1){//接收来自r.out子进程的消息msgrcv(msqid,&buf,SIZE,1,0);printf("取出的消息为:%s\n",buf.mtext);}}return 0;
}
r.c如下
#include<my_head.h>struct msgbuf
{long mtype; char mtext[1024];
};#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{//创建一个key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error\n");return -1;}//创建一个消息队列int msqid = msgget(key,IPC_CREAT|0664);if(msqid == -1){perror("msgget error");return -1;}printf("r.out:msqid=%d\n",msqid);//创建一个进程pid_t pid = fork();if(pid>0){struct msgbuf buf;while(1){//接收来自a.out父进程的消息msgrcv(msqid,&buf,SIZE,1,0);printf("取出的消息为:%s\n",buf.mtext);}}if(pid == 0){struct msgbuf buf;while(1){printf("请输入r,out子进程想要发送的消息类型:");scanf("%ld",&buf.mtype);getchar();printf("请输入想要发送的正文:");fgets(buf.mtext,SIZE,stdin);buf.mtext[strlen(buf.mtext)-1] = 0;if(strcmp(buf.mtext,"quit") == 0){break;}msgsnd(msqid,&buf,SIZE,0);}} return 0;
}
运行结果如图
思维导图