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 2 struct 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 xie rsvMsg(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 du buf[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 可以删除消息队列;
