IPC 訊息佇列

2021-08-02 09:39:02 字數 2889 閱讀 2473

#include

int msgget(key_t key, int msg***);

返回值:若成功,返回訊息佇列id;若出錯返回-1;

與其他ipc機制一樣,需要提供乙個鍵值key來命名某個特定的訊息佇列。可通過ftok()來生成。

msg***表示訊息佇列訪問許可權。可與兩個巨集配合進行操作:

ipc_creat:如果不存在訊息佇列鍵值為key那麼就建立乙個鍵值為key的訊息佇列,如果存在,則進行開啟此訊息佇列。

ipc_excl:一般與ipc_creat一起使用,msgget(key,ipc_creat|ipc_excl),如果該ipc已存在,則返回-1,一起使用可以保證ipc物件是新建立的不是開啟已有物件。

#include

int msgsnd(int msqid, const

void *msgp, size_t msgsz, int msg***);

返回值:若成功,返回0;若出錯,返回-1;

引數:

1)msqid:是msgget返回的訊息佇列id。

2)msgp:是乙個指向準備傳送訊息的指標,但是訊息的資料結構卻有一定的要求,指標msg_ptr所指向的訊息結構一定要是以乙個長整型成員變數開始的結構體,接收函式將用這個成員來確定訊息的型別。例如:

struct mymsgp;
這向mymsgp結構的指標。

3)msgsz:是msgp指向的訊息的長度,注意是訊息的長度,而不是整個結構體的長度,也就是說msgsz是不包括長整型訊息型別成員變數的長度

4)msg***:用於控制當前訊息佇列滿或佇列訊息到達系統範圍的限制時將要發生的事情。

如果呼叫成功,訊息資料的一分副本將被放到訊息佇列中,並返回0,失敗時返回-1。

- 從訊息佇列中取用訊息:msgrcv

原型:

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

int msg***);

返回值:若成功,返回訊息資料部分的長度;若出錯,返回-1;

引數:

msqid,msgp,msgsz的作用和函式msgsnd函式的一樣

1)msgtyp可以實現簡單的接受優先順序。

msgtyp==0 返回佇列中的第乙個訊息。

msgtyp>0 返回佇列中訊息型別為msgtyp的第乙個訊息。

msgtyp<0 返回佇列中訊息型別值小於等於msgtyp絕對值的訊息,如果有多個,則取型別值最小的訊息。

2)msg***用於控制當佇列中沒有相應型別的訊息時將發生的事情。

#include 

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

返回值:若成功,返回0;若失敗,返回-1

引數:

1)msqid是msgget的返回值。

2)cmd:cmd引數指定將要執行的動作、命令。它可以取三個值。

ipc_stat:取此訊息佇列的msqid_ds結構,並將它存放在buf指向的結構裡面。

ipc_set:將字段msg_perm.uid、msg_perm.gid、msg_perm.mode和msg_qbytes從buf指向的結構複製到與這個佇列相關的msqid_ds結構中。(執行只能是有效id等於msg_perm.cuid或uid的程序,或者超級使用者許可權的程序)

ipc_rmid:從系統中刪除該訊息佇列以及仍在該佇列中的所以資料。

三個命令也可用於訊號量和共享儲存中。

3)buf:buf是指向msqid_ds的結構的指標。

IPC 訊息佇列

訊息佇列可以認為是乙個訊息列表。執行緒可以往訊息佇列中放置訊息或者取出訊息。每個訊息都是一條記錄,由傳送者賦予乙個優先順序。乙個程序在往乙個訊息佇列中寫入訊息之前,不需要有某個程序在該佇列上等待訊息到達 這跟管道和fifo是相反的 訊息佇列具有隨核心的持續性,也就是說在核心重新啟動之前,不管發訊息的...

IPC之訊息佇列

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

IPC之訊息佇列

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