消息被髮送到隊列中。「消息隊列」是在消息的傳輸過程當中保存消息的容器。消息隊列管理器在將消息從ide
它的源中繼到它的目標時充當中間人。隊列的主要目的是提供路由並保證消息的傳遞;若是發送消息時函數
接收者不可用,消息隊列會保留消息,直到能夠成功地傳遞它。spa
msgget()函數被用來建立新的消息隊列或獲取已有的消息隊列。其函數定義以下:指針
系統調用: msgget()
函數聲明: int msgget ( key_t key, int msgflg )
返回值: message queue identifier on success
-1 on error: errno = EACCESS (permission denied)
EEXIST (Queue exists, cannot create)
EIDRM (Queue is marked for deletion)
ENOENT (Queue does not exist)
ENOMEM (Not enough memory to create queue)
ENOSPC (Maximum queue limit exceeded)
msgget()函數的第一個參數是消息隊列對象的關鍵字(key),函數將它與已有的消息隊
列對象的關鍵字進行比較來判斷消息隊列對象是否已經建立。而函數進行的具體操做是由
第二個參數,msgflg 控制的。它能夠取下面的幾個值:
IPC_CREAT :
若是消息隊列對象不存在,則建立之,不然則進行打開操做;
IPC_EXCL:
和IPC_CREAT 一塊兒使用(用」|」鏈接),若是消息對象不存在則建立之,不然產生一個
錯誤並返回。
若是單獨使用IPC_CREAT 標誌,msgget()函數要麼返回一個已經存在的消息隊列對象
的標識符,要麼返回一個新創建的消息隊列對象的標識符。若是將IPC_CREAT 和IPC_EXCL
標誌一塊兒使用,msgget()將返回一個新建的消息對象的標識符,或者返回-1 若是消息隊列
對象已存在。IPC_EXCL 標誌自己並無太大的意義,但和IPC_CREAT 標誌一塊兒使用可
以用來保證所得的消息隊列對象是新建立的而不是打開的已有的對象對象
msgflg:這個參數依然是是控制函數行爲的標誌,取值能夠是:0,表示忽略;IPC_NOWAIT,若是消息隊列爲空,則返回一個ENOMSG,並將控制權交回調用函數的進程。若是不指定這個參數,那麼進程將被阻塞直到函數能夠從隊列中獲得符合條件的消息爲止。若是一個client 正在等待消息的時候隊列被刪除,EIDRM 就會被返回。若是進程在阻塞等待過程當中收到了系統的中斷信號,EINTR 就會被返回。MSG_NOERROR,若是函數取得的消息長度大於msgsz,將只返回msgsz 長度的信息,剩下的部分被丟棄了。若是不指定這個參數,E2BIG 將被返回,而消息則留在隊列中不被取出。當消息從隊列內取出後,相應的消息就從隊列中刪除了。隊列
讀進程程序進程
#include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include "Ccommon.h" #include <sys/msg.h> int main() { bool isRuning = true; struct shared_use_str pshared_use_str; int imsgget; long int msg_to_receive = 0; //建立或者連接一個已經存在的消息隊列 imsgget = msgget((key_t)1234,0666|IPC_CREAT); if(-1 == imsgget) { printf("msgget failed\n"); exit(-1); } while(true == isRuning) { //讀取消息隊列內容 if(msgrcv(imsgget,(void *)&pshared_use_str,BUFSIZ,msg_to_receive,0) == -1) { printf("failed to receive message\n"); return -1; } printf("you enter %s\n",pshared_use_str.somedate); if(strncmp(pshared_use_str.somedate,"end",3) == 0) { isRuning = false; } } //刪除消息隊列 if(msgctl(imsgget,IPC_RMID,0) == -1) { printf("msgctl failed\n"); exit(-1); } return 0; }
寫進程路由
#include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include "Ccommon.h" #include <sys/msg.h> #include <errno.h> int main() { bool isRuning = true; struct shared_use_str pshared_use_str; int imsgget; //建立或者連接一個已經存在的消息隊列 imsgget = msgget((key_t)1234,0666|IPC_CREAT); if(-1 == imsgget) { printf("msgget failed\n"); exit(-1); } while(true == isRuning) { printf("Enter som data\n"); scanf("%s",pshared_use_str.somedate); //向消息隊列發送消息 if(msgsnd(imsgget, (void *) &pshared_use_str , 1000,0) == -1) { printf("failed to msgsnd message\n"); return -1; } if(strncmp(pshared_use_str.somedate,"end",3) == 0) { isRuning = false; } } return 0; }