IPC主題一之訊息佇列

2021-07-22 08:09:37 字數 2121 閱讀 9387

訊息佇列是訊息傳輸過程中儲存訊息的容器,就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向訊息佇列中按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。

1、訊息佇列應用於程序間的通訊

2、訊息佇列是面向資料塊的,程序間傳輸的是有型別(用於區分資料型別)的資料塊。

3、每個訊息佇列的總位元組數是有上限的,系統中總的訊息佇列也是有上限的

4、訊息佇列是隨核心持續的,只有在核心重起或者顯示刪除乙個訊息佇列時,該訊息佇列才會真正被刪除。

5、系統中記錄訊息佇列的資料結構(struct ipc_ids msg_ids)位於核心中,系統中的所有訊息佇列都可以在結構msg_ids中找到訪問入口。

6、 訊息佇列就是乙個訊息的鍊錶。每個訊息佇列都有乙個佇列頭,用結構struct msg_queue來描述。佇列頭中包含了訊息佇列鍵值、使用者id、組id、訊息佇列中訊息數目等等,甚至記錄了最近對訊息佇列讀寫程序的id

這裡我們可以畫乙個圖來表示訊息佇列:

1.建立新訊息佇列或取得已存在訊息佇列

原型:int msgget(key_t key, int msg***);

引數:

key:可以認為是乙個埠號,也可以由函式ftok生成。

msg***:ipc_creat值,若沒有該佇列,則建立乙個並返回新識別符號;若已存在,則返回原識別符號。ipc_excl值,不能單獨使用。只能和ipc_creat共用,如果沒有該佇列則建立乙個並返回新識別符號,如果有建立異常。

2.向佇列讀/寫訊息

原型:

msgrcv從佇列中取用訊息:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);

msgsnd將資料放到訊息佇列中:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

引數:

msqid:訊息佇列的標識碼

msgp:指向訊息緩衝區的指標,此位置用來暫時儲存傳送和接收的訊息,是乙個使用者可定義的通用結構,形態如下:

struct msgstru;

msgsz:訊息的大小。

msgtyp:從訊息佇列內讀取的訊息形態。如果值為零,則表示訊息佇列中的所有訊息都會被讀取。

msg***:用來指明核心程式在佇列沒有資料的情況下所應採取的行動。如果msg***和常數ipc_nowait合用,則在msgsnd()執行時若是訊息佇列已滿,則msgsnd()將不會阻塞,而會立即返回-1,如果執行的是msgrcv(),則在訊息佇列呈空時,不做等待馬上返回-1,並設定錯誤碼為enomsg。當msg***為0時,msgsnd()及msgrcv()在佇列呈滿或呈空的情形時,採取阻塞等待的處理模式。

3.設定訊息佇列屬性

原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );

引數:msgctl 系統呼叫對 msgqid 標識的訊息佇列執行 cmd 操作,系統定義了 3 種 cmd 操作: ipc_stat , ipc_set , ipc_rmid

ipc_stat : 該命令用來獲取訊息佇列對應的 msqid_ds 資料結構,並將其儲存到 buf 指定的位址空間。

ipc_set : 該命令用來設定訊息佇列的屬性,要設定的屬性儲存在buf中。

ipc_rmid : 從核心中刪除 msqid 標識的訊息佇列。

**連線:

實現效果:

檢視訊息佇列:

IPC之訊息佇列

訊息佇列缺點 1.如果程序建立了乙個訊息佇列,在該佇列中放入了幾則訊息,然後終止,但是該訊息佇列及其內容並不會被刪除。直到出現一下情況 某個程序呼叫msgrcv或 msgctl讀訊息或刪除訊息佇列,某個程序執行ipcrm 1 命令刪除訊息佇列,或由正在啟動的系統刪除訊息佇列。2.訊息佇列有大小限制,...

IPC之訊息佇列

可閱讀mq overview查閱更多資訊 man 7 mq overview.posix的訊息佇列實現更好,但systemv的訊息佇列更廣泛應用 舊的api posix的訊息佇列有兩種呼叫方式 庫函式和系統呼叫。訊息佇列是乙個訊息的鏈結列表,訊息都儲存在核心中,程序通過一種和共享記憶體使用的識別符號...

IPC之訊息佇列

一.特點 1.訊息佇列有特定的格式和優先順序 3.佇列裡可實現隨機查詢資訊,也可以按照資訊型別查詢 msgtpye 二.寫出 讀入都存到乙個結構體中 struct msgbuf 例如 struct msgbuf readbuf,sendbuf 三.四個必須知道的函式 1.得到訊息佇列識別符號或建立乙...