使用消息队列实现两个进程的相互通信
#include<myhead.h>//定义结构体存储信息种类和信息正文
typedef struct
{long mtype; //信息类型char mtext[128]; //信息正文
}msgbuf;//宏定义信息正文的大小
#define MESIZE sizeof(msgbuf)-sizeof(long)typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;//分支线程接收信息
void* task(void* arg)
{//定义key值key_t key = ftok("/",'a');//判断key是否创建成功if(key==-1){perror("ftok error");return NULL;}//创建消息队列int msqid=msgget(key,IPC_CREAT|0664);//判断是否创建成功if(msqid==-1){perror("msgget error");return NULL;}//定义结构体变量msgbuf buf;while(1){//读取信息类型为2的第一个数据msgrcv(msqid,&buf,MESIZE,2,0);//将读取到的信息打印到终端printf("接收到的消息为>>>%s\n",buf.mtext);//读取到quit跳出循环if(strcmp(buf.mtext,"quit")==0){break;}}//删除消息队列msgctl(msqid,IPC_RMID,NULL);//结束分支线程pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//定义key值key_t key=ftok("/",'a');if(key==-1){perror("ftok error");return -1;}//创建消息队列int mspid = msgget(key,IPC_CREAT|0664);if(mspid==-1){perror("msgget error");return -1;}msgbuf buf;//创建分支线程pthread_t tid=-1;if(pthread_create(&tid,NULL,task,NULL)==-1){printf("创建线程失败\n");return -1;}while(1){printf("请输入消息类型>>>");scanf("%ld",&buf.mtype);getchar();//吸收回车printf("请输入要发送的消息:");fgets(buf.mtext,sizeof(buf.mtext),stdin);//终端输入信息buf.mtext[strlen(buf.mtext)-1]=0;//将回车替换为'\0'//以非阻塞的形式将信息写入队列msgsnd(mspid,&buf,MESIZE,IPC_NOWAIT);printf("发送成功\n");//写入quit结束写入if(strcmp(buf.mtext,"quit")==0){break;}}//等待分支线程结束回收资源pthread_join(tid,NULL);return 0;
}
#include<myhead.h>typedef struct
{long mtype;char mtext[128];
}msgbuf;
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;#define MESIZE sizeof(msgbuf)-sizeof(long)
//分支线程写入信息
void* task(void* arg)
{key_t key=ftok("/",'a');if(key==-1){perror("ftok error");return NULL;}//创建消息队列int mspid=msgget(key,IPC_CREAT|0664);if(mspid==-1){perror("msgget error");return NULL;}msgbuf buf;while(1){printf("请输入消息类型>>>");scanf("%ld",&buf.mtype);getchar();printf("请输入要发送的消息>>>");fgets(buf.mtext,sizeof(buf.mtext),stdin);buf.mtext[strlen(buf.mtext)-1]=0;msgsnd(mspid,&buf,MESIZE,IPC_NOWAIT);printf("发送成功\n");if(strcmp(buf.mtext,"quit")==0){break;}}//结束分支线程pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//定义key值key_t key = ftok("/",'a');if(key==-1){perror("ftok error");return -1;}//创建消息队列int mspid = msgget(key,IPC_CREAT|0664);if(mspid==-1){perror("msgget error");return -1;}msgbuf buf;//创建分支线程pthread_t tid=-1;if(pthread_create(&tid,NULL,task,NULL)==-1){printf("创建线程失败\n");return -1;}while(1){//读取信息类型为1的信息msgrcv(mspid,&buf,MESIZE,1,0);printf("接收的消息为:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit")==0){break;}}//回收资源pthread_join(tid,NULL);return 0;
}