进程间通信 :消息队列的实现
一.消息队列
消息队列是一个进程向另一个进程发送一个数据块的方法,所以消息队列是基于消息的,而管道则是基于字节流的。消息队列提供的是进程间的双向通信。
消息队列中的几个原型函数:
1.获取消息信息:int msgget(key_t key,int msgflag);key 是用ftok()函数创建的
2.接收消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
3.发送消息:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
4.销毁消息信息:int msfctl(int msgid)
查看key值命令:ipcs -q
删除key值命令:ipcs -q key值
//comm.h#pragmaonce#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/msg.h>#define_PATH_"."//路径#define_PROJ_ID_0x7777#define_BLOCK_SIZE_1024#define_CLIENT_TYPE_1#define_SERVER_TYPE_2structmsgBuf//定义一个消息结构体{longmtype;//消息类型charmtext[_BLOCK_SIZE_];};staticintcreat_msg_queue();intget_msg_queue();intsend_msg_queue(intmsg_id,constchar*info,longtype);intrecv_msg_queue(intmsg_id,charinfo[],longtype);intdestroy_msg_queue(intmsg_id);//comm.c#include"comm.h"intget_msg_queue(){returncreat_msg_queue();}staticintcreat_msg_queue(){key_tkey=ftok(_PATH_,_PROJ_ID_);if(key<0){perror("ftok");return-1;}intmsg_id=msgget(key,IPC_CREAT);if(msg_id<0){perror("msgget");return-1;}returnmsg_id;}intsend_msg_queue(intmsg_id,constchar*info,longtype)//将要发送的消息存入mtext中{structmsgBufmsg;msg.mtype=type;memset(msg.mtext,'\0',sizeof(msg.mtext));strcpy(msg.mtext,info);if(msgsnd(msg_id,&msg,sizeof(msg.mtext),0)<0){perror("msgsnd");return-1;}return0;}intrecv_msg_queue(intmsg_id,char*info,longtype)//将mtext中的消息拿出放入info中{structmsgBufmsg;if(msgrcv(msg_id,&msg,sizeof(msg.mtext),type,0)<0){perror("msgrcv");return-1;}strcpy(info,msg.mtext);return0;}intdestroy_msg_queue(intmsg_id){if(msgctl(msg_id,IPC_RMID,NULL)<0){perror("msgctl");return-1;}return0;}//server.c先发送后接收#include"comm.h"intmain(){intmsgid=get_msg_queue();if(msgid<0){exit(1);}charinfo[_BLOCK_SIZE_];while(1){memset(info,'\0',sizeof(info));printf("pleaseinput:");fflush(stdout);gets(info);if(send_msg_queue(msgid,info,_SERVER_TYPE_)<0){printf("sendinformationfailed\n");exit(1);}if(recv_msg_queue(msgid,info,_CLIENT_TYPE_)<0){printf("recieveinformationfailed\n");exit(1);}printf("client:%s\n",info);}destroy(msgid);return0;}//client.c先接收后发送#include"comm.h"intmain(){intmsgid=get_msg_queue();if(msgid<0){exit(1);}charinfo[_BLOCK_SIZE_];memset(info,'\0',sizeof(info));printf("wheninputstopendding...\n");while(1){if(recv_msg_queue(msgid,info,_SERVER_TYPE_)<0){printf("recieveinformationfailed\n");exit(1);}else{if(strcmp("stop",info)==0){return0;}printf("server:%s\n",info);}printf("pleaseinput:");fflush(stdout);gets(info);if(send_msg_queue(msgid,info,_CLIENT_TYPE_)<0){printf("sendinformationfailed\n");exit(1);}}destroy(msgid);return0;}
运行结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。