Linux程序通訊之訊息佇列

2021-10-10 08:30:07 字數 4443 閱讀 7472

訊息佇列主要由下面四個函式組成

1、msgget

2、msgctl

3、msgsnd

3、msgrcv

1、msgget

得到訊息佇列識別符號或建立乙個訊息佇列物件並返回訊息佇列識別符號

#include

#include

#include

intmsgget

(key_t key,

int msg***)

注意:這裡少了乙個size引數

成功:返回訊息佇列的識別符號

出錯:-1

#include

#include

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

**ar**)

printf

("create msgaqu is successfuli:[%d]\n"

,msgid)

;system

("ipcs -q");

return0;

}

2、msgctl

獲取、設定訊息佇列的屬性,即刪除訊息佇列

#include

#include

#include

intmsgctl

(int msqid,

int cmd,

struct msqid_ds *buf)

跟共享記憶體的一樣,這裡就不多說了
成功:0

出錯:-1

#include

#include

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

**ar**)

printf

("create msgaqu is successfuli:[%d]\n"

,msgid)

;system

("ipcs -q");

//刪除核心中訊息佇列

msgctl

(msgid,ipc_rmid,

null);

system

("ipcs -q");

return0;

}

3、msgsnd

將msgp訊息寫入到識別符號為msqid的訊息佇列

#include

#include

#include

intmsgsnd

(int msgid,

const

void

*msgp, size_t msgsz,

int msg***)

msgid : 訊息佇列識別符號

msgp : 傳送給佇列的訊息。一般為結構體,如下:

struct msg_form

;msgsz : 要傳送訊息的大小,不含訊息型別占用的4個位元組,即mtext的長度

msg*** : 三種情況如下

0:當訊息佇列滿時,msgsnd將會阻塞,直到訊息能寫進訊息佇列

ipc_nowait:當訊息佇列已滿的時候,msgsnd函式不等待立即返回

ipc_noerror:若傳送的訊息大於size位元組,則把該訊息截斷,截斷部分將被丟棄,且不通知傳送程序。

成功:0

失敗:-

1

#include

#include

#include

#include

#include

// 用於建立乙個唯一的key

#define msg_file "/etc/passwd"

// 訊息結構

struct msg_form

;int

main()

// 列印key值

printf

("message queue - server key is: %d.\n"

, key)

;// 建立訊息佇列if(

(msqid =

msgget

(key, ipc_creat|

0777))

==-1)

// 列印訊息佇列id及程序id

printf

("my msqid is: %d.\n"

, msqid)

;printf

("my pid is: %d.\n"

,getpid()

);// 迴圈讀取訊息

for(;;

)return0;

}

4、msgrcv

從識別符號為msqid的訊息佇列讀取訊息並存於msgp中,讀取後把此訊息從訊息佇列中刪除

#include

#include

#include

ssize_t msgrcv

(int msgid,

void

*msgp, size_t msgsz,

long msgtyp,

int msg***)

;

msgid : 訊息佇列識別符號

msgp : 存放訊息的結構體,結構體型別要與msgsnd函式傳送的型別相同

msgsz : 要接收訊息的大小,不含訊息型別占用的4個位元組

msgtyp : 有三種情況

0:接收第乙個訊息

>

0:接收型別等於msgtyp的第乙個訊息

<

0:接收型別等於或者小於msgtyp絕對值的第乙個訊息

msg*** : 有四種情況

0: 阻塞式接收訊息,沒有該型別的訊息msgrcv函式一直阻塞等待

ipc_nowait:如果沒有返回條件的訊息呼叫立即返回,此時錯誤碼為enomsg

ipc_except:與msgtype配合使用返回佇列中第乙個型別不為msgtype的訊息

ipc_noerror:如果佇列中滿足條件的訊息內容大於所請求的size位元組,則把該訊息截斷,截斷部分將被丟棄

#include

#include

#include

#include

#include

// 用於建立乙個唯一的key

#define msg_file "/etc/passwd"

// 訊息結構

struct msg_form

;int

main()

// 列印key值

printf

("message queue - client key is: %d.\n"

, key)

;// 開啟訊息佇列if(

(msqid =

msgget

(key, ipc_creat|

0777))

==-1)

// 列印訊息佇列id及程序id

printf

("my msqid is: %d.\n"

, msqid)

;printf

("my pid is: %d.\n"

,getpid()

);// 新增訊息,型別為888

msg.mtype =

888;

sprintf

(msg.mtext,

"hello, i'm client %d"

,getpid()

);msgsnd

(msqid,

&msg,

sizeof

(msg.mtext),0

);// 讀取型別為777的訊息,ipc_nowait表示非阻塞,0是阻塞

msgrcv

(msqid,

&msg,

256,

777, ipc_nowait)

;printf

("client: receive msg.mtext is: %s.\n"

, msg.mtext)

;printf

("client: receive msg.mtype is: %ld.\n"

, msg.mtype)

;return0;

}

linux程序間通訊之訊息佇列

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

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...

Linux程序間通訊之訊息佇列

實現功能 編寫程式sender,它建立乙個訊息佇列 然後,迴圈等待使用者通過終端輸入一串字元,將這串字元通過訊息佇列傳送給receiver,直到使用者輸入 bye 為止 最後,它向receiver程序傳送訊息 end 並且等待receiver的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...