linux應用程式設計 程序間通訊 二 訊息佇列

2021-10-05 01:15:54 字數 2776 閱讀 3302

2.1 msgget

#include

#include

#include

/* @function 用於建立乙個新的訊息佇列或訪問乙個已存在的訊息佇列

* @param[in] key 通常由ftok建立,也可以指定為ipc_private

* @param[in] msg*** 讀寫許可權值的組合。它還可以與ipc_creat或ipc_creat|ipc_excl按位或

* @return 成功:非負識別符號,失敗:-1

*/int

msgget

(key_t key,

int msg***)

;//用例

intmain

(int argc,

char

*ar**)

2.2 msgsnd
/* @function 往msqid識別符號的訊息佇列放置一條訊息

* @param[in] msqid 訊息佇列標識

* @param[in] msgp 待傳送訊息結構體的位址。訊息結構通常如果 struct msgbuf

* @param[in] msgsz 訊息正文的長度 msgsz = sizeof(mymsg)-sizeof(long)

* @param[in] msg*** 用於控制當前訊息佇列滿或佇列訊息到達系統範圍的限制時將要發生的事情

* @arg:0 msgsnd() 呼叫阻塞直到條件滿足為止。

* @arg:ipc_nowait msgsnd() 呼叫阻塞直到條件滿足為止。

* @return 成功:0,失敗:-1

* note:如果 msg*** 指定了ipc_nowait,當佇列滿或佇列訊息數已經超過系統的限制,msgsnd返回乙個eagain錯誤,不阻塞程序;

* 如果為0,則阻塞程序,直到滿足下面三種情況:

* ① 具備存放新訊息的空間;

* ② 由msqid標識的訊息佇列從系統中刪除(這種情況下返回乙個etdrm錯誤)

* ③ 呼叫執行緒被某個捕獲的訊號所中斷(這種情況下返回乙個eintr錯誤)。

*//* message buffer for msgsnd and msgrcv calls */

struct msgbuf mymsg;

intmsgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

;//用例

intmain

(int argc,

char

*ar**)

2.3 msgrcv
/* @function 往msqid識別符號的訊息佇列讀取一條訊息

* @param[in] msqid 訊息佇列標識

* @param[out] msgp 讀取訊息的快取區的位址

* @param[in] msgsz 讀取正文訊息位元組長度

* @param[in] msgtyp 與上面struct msgbuf 結構中成員 mtype 有關

* @arg msgtyp == 0, 返回佇列中的第乙個訊息。

* @arg msgtyp > 0, 返回佇列中訊息型別為 msgtyp 的第乙個訊息(常用)。

* @arg msgtyp < 0, 返回佇列中訊息型別值小於或等於 msgtyp 絕對值的訊息,如果這種訊息有若干個,則取型別值最小的訊息。

* @param[in] msg*** 同msgsnd,但還可以指定msg_ noerror:當所接收訊息的真正資料部分大於 msgsz引數時,

* 如果設定了該位, msgrcvi函式就只是截短資料部分,而不返回錯誤,否則,ms_grev返回乙個e2big錯誤。

* @return 成功:讀取資訊的位元組長度, 失敗:-1

* @note 成功返回時, msgrcv返回的是所接收訊息中資料的位元組數。它不包括通過msgp引數返回的長整數訊息型別所需的幾個位元組。

*/ssize_t msgrcv

(int msqid,

void

*msgp, size_t msgsz,

long msgtyp,

int msg***)

;//用例

intmain

(int argc,

char

*ar**)

2.4 msgctl
struct msqid_ds 

;/* @function 操作並控制訊息佇列

* @param[in] msqid 訊息佇列標識

* @param[in] cmd 控制命令

* 相當於,把訊息佇列的屬性備份到 buf 裡。

* 相當於,訊息佇列原來的屬性值清空,再由 buf 來替換。

* @param[in] buf 訊息佇列結構快取區

* @return 成功:0,失敗:-1

*/int

msgctl

(int msqid,

int cmd,

struct msqid_ds *buf)

;//用例1

intmain

(int argc,

char

*ar**)

//用例2

intmain

(int argc,

char

*ar**)

Linux應用程式設計 程序通訊

通訊方式有管道pipe,訊號 一 pipe 管道分兩種無名管道,有名管道。1 無名管道 父程序和子程序可通過無名管道傳輸資料,管道有兩個口,一端寫一端讀,半雙工通訊。可以當作檔案進行操作,所以建立的管道會有兩個檔案描述符fds 0 和fds 1 fds 0 用於讀,fds 1 用於寫,關係如圖。實驗...

linux應用程式設計基礎 程序間通訊(IPC)

theme 程序間通訊 ipc author jeff.xue contact information contactmexkj 163.com 1.程序間通訊作用 2.通訊方式 3.管道通訊 1 管道 單向 先進先出 2 管道種類 3 無名管道 4 命名管道 fifo 不相干程序交換資訊 4.訊號...

Linux應用程式設計 09 程序間通訊 訊號通訊

訊號通訊 訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式訊號可以直接進行使用者空間程序和核心程序之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件 如果該程序當前並未處於執行態,則該訊號就由核心儲存起來,直到該程序恢復執行再傳遞給它 如果乙個訊號被程序設定為阻塞,則...