消息队列

来源:互联网 发布:物理虚拟实验室软件 编辑:程序博客网 时间:2024/06/16 13:37

XSIPC(消息队列,信号,和共享内存)

消息队列提供一种从一个进程向另一进程发送数据块的方法;每个数据块都有自己的类型,与管道不同的的是,消息队列是基于消息的,而管道是基于字节流的;

//comm.h

#ifndef _COMM_H_#define _COMM_H#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>#define PATHNAME "."#define PROJ_ID 0x6664#define SERVER_TYPE 1#define CLIENT_TYPE 2struct msgbuf{long mtype;char mtext[1024];};int creatMsgQueue();int sendMsg();int rsvMsg();int destoryMsg();#endif


//comm.c
#include"common.h"int commQueue(int flag){key_t _key= ftok(PATHNAME,PROJ_ID);if(_key<0){perror("ftok");return -1;}int msgid=msgget(_key,flag);if(msgid<0){perror("msgget");return -1;}return msgid;}int creatMsgQueue(){return commQueue(IPC_CREAT|IPC_EXCL|0666);}int getMsgQueue(){return commQueue(IPC_CREAT);}int sendMsg(int msgid,int who,char* msg){struct msgbuf buf;strcpy(buf.mtext,msg);buf.mtype=who;if(msgsnd(msgid,&buf,1024,0)<0){perror("msgsnd");return -1;}   return 0;}int rsvMsg(int msgid,int who,char* out){struct msgbuf buf;if(msgrcv(msgid,(void *)&buf,1024,who,0)<0){perror("msgrcv");return -1;}strcpy(out,buf.mtext);return 0;}
//没有销毁的代码;

//server.c

int main(){char buf[1024];int msgid=creatMsgQueue();while(1){//xian du zai xiersvMsg(msgid,CLIENT_TYPE,buf);printf("%s\n",buf);printf("enter data ");ssize_t s=read(0,buf,sizeof(buf)-1);if(s>0){buf[s-1]=0;sendMsg(msgid,SERVER_TYPE,buf);}}}


//client.c
int main(){char buf[1024];int msgid=getMsgQueue();//printf("%d",msgid);while(1){//xian xie zai dubuf[0]=0;printf("enter data ");fflush(stdout);ssize_t s=read(0,buf,sizeof(buf)-1);if(s>0){buf[s-1]=0;sendMsg(msgid,CLIENT_TYPE,buf);}//char bufrcv[1024];rsvMsg(msgid,SERVER_TYPE,buf);printf("%s",buf);}}
使用ipcs -q可以查看消息队列;

使用ipcrm -q 可以删除消息队列;




原创粉丝点击