消息隊列:操作系統(tǒng)提供緩沖區(qū),提供了一種從一個進程向另一個進程發(fā)送一個數(shù)據(jù)塊的方法。消息隊列與管道不同的是,消息隊列是基于消息的,而管道是基于字節(jié)流的。
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、林州ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的林州網(wǎng)站制作公司
查看系統(tǒng)消息隊列命令:ipcs -q
刪除消息隊列命令:ipcrm -q 消息id號
相關(guān)函數(shù):
原型: 產(chǎn)生消息隊列:int msgget(key_t key, int msgflg);
發(fā)送消息:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
接收消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
設(shè)置消息隊列屬性原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
參數(shù):系統(tǒng)定義了3 種 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID
IPC_STAT : 該命令用來獲取消息隊列對應(yīng)的 msqid_ds 數(shù)據(jù)結(jié)構(gòu),并將其保存到 buf 指定的地址空間。
IPC_SET : 該命令來設(shè)置消息隊列的屬性,要設(shè)置的屬性存儲在buf中。
IPC_RMID : 從內(nèi)核中刪除 msqid 標識的消息隊列。
//comm.h 1 #pragma once 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define _PATH_ "." 10 #define _PROJ_ID_ 0x777 11 #define _BLOCK_SIZE_ 1024 12 #define _SERVER_MSG_TYPE_ 1 13 #define _CLIENT_MSG_TYPE_ 2 14 struct msgbuf 15 { 16 long mtype; 17 char mtext[_BLOCK_SIZE_]; 18 }; 19 static int comm_msg_queue(int flag); 20 int set_msg_queue(); 21 int get_msg_queue(); 22 int msg_queue_send(int msg_id,const char* msg,long type); 23 int msg_queue_recv(int msg_id,char* msg,long type); 24 int destory_msg_queue(int msgId); //comm.c 1 #include"comm.h" 2 static int comm_msg_queue(int flag) 3 { 4 5 key_t _key=ftok(_PATH_,_PROJ_ID_); 6 if(_key<0) 7 { 8 perror("ftok"); 9 return -1; 10 } 11 int msg_id=msgget(_key,flag); 12 if(msg_id<0) 13 { 14 perror("msgget"); 15 return -1; 16 } 17 return msg_id; 18 } 19 int set_msg_queue() 20 { 21 umask(0); 22 return comm_msg_queue(IPC_CREAT|IPC_EXCL|0666); 23 } 24 int get_msg_queue() 25 { 26 return comm_msg_queue(IPC_CREAT); 27 } 28 int msg_queue_send(int msg_id,const char* message,long type) 29 { 30 struct msgbuf msg; 31 msg.mtype=type; 32 strcpy(msg.mtext,message); 33 if(msgsnd(msg_id,&msg,strlen(msg.mtext),0)<0) 34 { 35 perror("msgsnd"); 36 return -1; 37 } 38 return 0; 39 } 40 int msg_queue_recv(int msg_id,char* msg,long type) 41 { 42 struct msgbuf ret; 43 memset(ret.mtext,'\0',_BLOCK_SIZE_); 44 if(msgrcv(msg_id,&ret,_BLOCK_SIZE_-1,type,0)<0) 45 { 46 perror("msgrcv"); 47 return -1; 48 } 49 strcpy(msg,ret.mtext); 50 return 0; 51 } 52 int destory_msg_queue(int msg_id) 53 { 54 if(msgctl(msg_id,IPC_RMID,NULL)<0) 55 { 56 perror("msgctl"); 57 return -1; 58 } 59 else 60 { 61 printf("remove msg_queue\n"); 62 return 0; 63 } 64 } //server.c 1 #include"comm.h" 2 int main() 3 { 4 int msgid=set_msg_queue(); 5 if(msgid<0) 6 { 7 exit(1); 8 } 9 char buf[_BLOCK_SIZE_]; 10 printf("input quit endding..\n"); 11 while(1) 12 { 13 if(msg_queue_recv(msgid,buf,_CLIENT_MSG_TYPE_)<0) 14 { 15 printf("recv fail\n"); 16 exit(1); 17 } 18 else 19 { 20 if(strcmp("quit",buf)==0) 21 return 0; 22 printf("client:%s\n",buf); 23 } 24 printf("input:"); 25 fflush(stdout); 26 memset(buf,'\0',_BLOCK_SIZE_); 27 gets(buf); 28 if(msg_queue_send(msgid,buf,_SERVER_MSG_TYPE_)<0) 29 { 30 printf("send fail\n"); 31 exit(1); 32 } 33 } 34 destroy(msgid); 35 return 0; 36 } //client.c 1 #include"comm.h" 2 int main() 3 { 4 int msgid=get_msg_queue(); 5 if(msgid<0) 6 { 7 exit(1); 8 } 9 char buf[_BLOCK_SIZE_]; 10 while(1) 11 { 12 fflush(stdout); 13 printf("please input:"); 14 memset(buf,'\0',_BLOCK_SIZE_); 15 gets(buf); 16 if(msg_queue_send(msgid,buf,_CLIENT_MSG_TYPE_)<0) 17 { 18 printf("send fail\n"); 19 exit(1); 20 } 21 if(msg_queue_recv(msgid,buf,_SERVER_MSG_TYPE_)<0) 22 { 23 printf("recv fail\n"); 24 exit(1); 25 } 26 printf("server:%s\n",buf); 27 } 28 return 0; 29 } //Makefile的編寫 1 .PHONY:all 2 all:server client 3 server:server.c comm.c 4 gcc -o $@ $^ 5 client:client.c comm.c 6 gcc -o $@ $^ 7 .PHONY:clean 8 clean: 9 rm -f server client
運行結(jié)果: