什么是消息隊列?
消息隊列提供了一種從進程向另一個進程發送一個數據塊的方法。每個數據塊都被認為是有一個類型,接收者進程的數據塊可以有不同的類型值。
消息隊列與管道的區別:消息隊列是基于消息的,而管道是基于字節流的,且消息隊列的讀取不一定是先入先出。
相關函數
創建新消息隊列或取得已存在消息隊列
返回值:成功,返回消息隊列的標識符
失敗,返回-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”
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。