1. 使用消息队列完成两个进程之间相互通信
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义队列消息结构体
typedef struct msgbuf{
long msgtype; //消息类型
char msgtext[200]; //消息内容
}msgbuf , *msgbuf_p;
//发送消息内容的长度
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
#endif
#include "head.h"
int main(int argc, const char *argv[])
{
//创建进程
pid_t pid = -1;
pid = fork();
msgbuf buf={.msgtype=200};
//主进程
if(pid > 0){
//从队列中读取消息
//创建key
key_t key = ftok("/",'k');
if(key == -1){
perror("process_2 ftork error");
return -1;
}
//创建消息队列
int msgId = msgget(key,IPC_CREAT|0664);
if(msgId == -1){
perror("process_2 msgget error");
return -1;
}
while(1){
//printf("process_2 请输入消息类型 ");
//scanf("%ld",&buf.msgtype);
//getchar();
bzero(buf.msgtext,sizeof(buf.msgtext));
printf("process_2 请输入消息内容 ");
scanf("%s",buf.msgtext);
getchar();
msgsnd(msgId,&buf,SIZE,0);
if(strcmp(buf.msgtext,"tuichu") == 0){
break;
}
}
}else if(pid == 0){
//发送消息
//创建key
key_t key = ftok("/",'k');
if(key == -1){
perror("process_2 ftork error");
return -1;
}
//创建消息队列
int msgId = msgget(key,IPC_CREAT|0664);
if(msgId == -1){
perror("process_2 msgget error");
return -1;
}
while(1){
//printf("process_2 请输入消息类型 ");
//scanf("%ld",&buf.msgtype);
bzero(buf.msgtext,sizeof(buf.msgtext));
msgrcv(msgId,&buf,SIZE,100,0);
printf("process_2 读取 A 的消息 %s\n",buf.msgtext);
if(strcmp(buf.msgtext,"tuichu") == 0){
break;
}
}
}else {
perror("process_2 fork error");
return -1;
}
/*4、删除消息队列
if(msgctl(msgId, IPC_RMID, NULL) == -1){
perror("msgctl error");
return -1;
}
*/
return 0;
}
#include "head.h"
int main(int argc, const char *argv[])
{
//创建进程
pid_t pid = -1;
pid = fork();
//主进程
msgbuf buf={.msgtype=100};
if(pid > 0){
//创建key
key_t key = ftok("/",'k');
if(key == -1){
perror("process_1 ftork error");
return -1;
}
//创建消息队列
int msgId = msgget(key,IPC_CREAT|0664);
if(msgId == -1){
perror("process_1 msgget error");
return -1;
}
//往队列中发送消息
while(1){
//printf("process_1 请输入消息类型 ");
//scanf("%ld",&buf.msgtype);
//getchar();
bzero(buf.msgtext,sizeof(buf.msgtext));
printf("process_1 请输入消息内容 ");
scanf("%s",buf.msgtext);
msgsnd(msgId,&buf,SIZE,0);
if(strcmp(buf.msgtext,"tuichu") == 0){
break;
}
}
//子进程
}else if(pid == 0){
//往队列中获取消息
//创建key
key_t key = ftok("/",'k');
if(key == -1){
perror("process_1 ftork error");
return -1;
}
//创建消息队列
int msgId = msgget(key,IPC_CREAT|0664);
if(msgId == -1){
perror("process_1 msgget error");
return -1;
}
while(1){
//printf("process_1 请输入消息类型 ");
//scanf("%ld",&buf.msgtype);
bzero(buf.msgtext,sizeof(buf.msgtext));
msgrcv(msgId,&buf,SIZE,200,0);
printf("process_1 读取 B 的消息 %s\n",buf.msgtext);
if(strcmp(buf.msgtext,"tuichu") == 0){
break;
}
}
}else{
perror("process_1 fork error");
return -1;
}
/*4、删除消息队列
if(msgctl(msgId, IPC_RMID, NULL) == -1){
perror("msgctl error");
return -1;
}*/
return 0;
}
2. 思维导图