什麼是消息隊列?
消息隊列提供了一種從進程向另一個進程發送一個數據塊的方法。每個數據塊都被認爲是有一個類型,接收者進程的數據塊可以有不同的類型值。
消息隊列與管道的區別:消息隊列是基於消息的,而管道是基於字節流的,且消息隊列的讀取不一定是先入先出。
相關函數
失敗,返回-1
第一個參數:消息隊列對象的關鍵字,函數將它與已有的消息隊列對象的關鍵字進行比較來判斷消息 隊列是否已經創建。由函數ftok()得來。
第二個參數:控制函數的具體操作。可以取以下幾個值:
IPC_CREAT:如果消息隊列不存在則創建,否則直接打開。
IPC_EXCL:單獨使用無意義。
IPC_CREAR | IPC_EXCL :消息隊列時新創建的。
3. ftok函數
函數ftok把一個已存在的路徑名和一個整數標識得轉換成一個key_t值,稱爲IPC鍵。
key_t ftok(const char* patnname,int id);
pathname:路徑必須存在且可以訪問
id: 低8位
4. 向隊列讀/寫消息
msgsnd將數據放到消息隊列中,msgrcv從隊列中取消息
msqid: 消息隊列的標識符
msgp: 指向消息緩衝區的指針,此位置用來暫時存儲發送和接受的消息,是用戶定義的通用的結構。
msgsz:消息的大小
msgtyp:從消息隊列內讀取的消息形態。若爲0,則消息隊列中的所有消息都被取完。
msgflg: msgflg爲0時,msgsnd()和msgrcv()在隊列呈滿或空的情形時,採取阻塞等待的處理模式。
msgflg和常數連用時,msgsnd()執行時若隊列滿,msgrcv()將不會阻塞,而是返回-1,若 執行msgrcv(),則在消息隊列呈空時,等待不做返回-1.
5. 設置消息隊列的屬性
函數原型: int msgctl(int msgqid,int cmd,struct msqid_ds *buf);
對msgqid標識的消息隊列執行cmd操作。cmd操作分三種:IPC_STAT,IPC_SET,IPC_RMID
IPC_STAT:該命令用來獲取消息隊列對應的msqid_ds數據結構,並將其保存到buf指定的地址空間。
IPC_SET:該命令用來設置消息隊列的屬性,要設置的屬性存儲在buf中。
IPC_RMID:從內核中刪除msqid標識的消息隊列。
6. 查看消息隊列 ipcs -q
刪除消息隊列 ipcrm -q semid
“comm.h”
“comm.c”
“client.c”
“server.c”