訊息佇列 程序間通訊方式

2021-10-14 14:28:54 字數 3662 閱讀 1133

一、概念

訊息佇列是由存放在核心中由訊息組成的鍊錶,由ipc id標識。使用者可以在訊息佇列中新增和讀取訊息。

特點:

1.訊息佇列提供的是一種帶有資料標識的特殊管道,因此可以選擇性的讀取資訊;

2.如果訊息佇列中有多條型別一樣的訊息,接收的時候只能按照先後順序接收(佇列特點);

3.如果你接收的訊息型別不存在,接收會阻塞。

1.建立ipc鍵值

建立ipc之前必須獲取乙個未使用的ipc鍵值(key);

#include

#include

key_t ftok

(const

char

*pathname,

int proj_id)

;引數:1.pathname必須是乙個已經存在的目錄

2.proj_id專案表符是乙個8位,1個位元組的值,通常用字母a,b表示。

2.獲取訊息佇列id

# include

# include

# include

intmsgget

(key_t key,

int msg***)

;引數:1.key,訊息佇列的鍵值,可以使用ftok獲得或者使用ipc_private

2.msg***可以為ipc_creat、ipc_excl、ipc_nowait或者三者的結果

1>ipc_creat:若核心中不存在指定佇列就建立它,第二個引數還需要與檔案許可權一起使用,例如

ipc_creat|

00666表示若核心中不存在指定佇列則建立它,同時程序可以對佇列訊息進行讀寫操作。;

2>ipc_excl:當與ipc_creat一起使用時,若佇列已存在則出錯(函式返回-

1)。

3.傳送訊息到訊息佇列中

# include

# include

# include

intmsgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

;引數:1.訊息佇列的id

2.指向訊息緩衝區,傳送訊息必須把訊息打包成結構體

struct msg

;3.訊息的長度

4.message flag,可設定為0和ipc_nowait,標誌為*

*ipc_nowait*

*,表示msgsnd操作以非阻塞的方式進行,在訊息佇列中沒有可用的空間時,msgsnd操作會立刻返回。並指定eagain錯誤;

標誌為**0

**,表示msgsnd操作以阻塞的方式進行,這種情況下在訊息佇列中沒有可用的空間時呼叫執行緒會被阻塞,直到下面的情況發生:

4.從訊息佇列中讀取訊息

# include

# include

# include

intmsgrcv

(int msqid,

void

*msgp, size_t msgsz,

long msgtyp,

int msg***)

;引數1:msqid-訊息佇列的id

2:msgp-指向訊息緩衝區

3:訊息的大小

4:指定要從佇列中獲取的訊息型別,若取0,任意型別都接收

5.訊息佇列的刪除、屬性設定和獲取控制等操作

#include

#include

#include

intmsgctl

(int msgid,

int cmd,

struct msqid_ds *buf)

;引數1:msqid-訊息佇列的id

2:控制操作的命令,sus標準提供以下三個命令

**ipc_rmid*

*,刪除乙個訊息佇列。執行該命令系統會立刻把該訊息佇列從核心中刪除,該訊息佇列中的所有訊息將會被丟棄。

**ipc_set*

*,根據buf的所指的值來設定訊息佇列msqid_ds結構中的msg_perm.uid,msg_perm.gid,msg_perm.mode,msg_qbytes四個成員。

**ipc_stat*

*,通過buf返回當前訊息佇列的msqid_ds結構。

3.buf:指向msqid_ds結構的指

6.系統v訊息佇列的限制

系統範圍內的最大訊息數,在linux下這個限制由msgmnb*msgmni決定。

可以通過ipc_set來設定使用中的訊息佇列的最大位元組數。但是要在系統範圍內對核心限制進行修改,在linux下面可以通過修改**/etc/sysctl.conf核心引數配置檔案,然後配合sysctl**命令來對核心引數進行設定。

二、程式demon

傳送端

#include

#include

#include

#include

#include

#include

#define max 1024

struct msg

;int

main()

printf

("===misgid is %d\n"

,msgid)

;while

(running)if(

strncmp

(buffer,

"quit",3

)==0)

running=0;

}printf

("exit success");

exit

(exit_success)

;}

讀取資訊端

#include

#include

#include

#include

#include

#include

#include

#include

#define max 1024

struct msg

;int

main()

while

(running)

printf

("rcv data msg_type is %ld\n"

,data.msgtype)

;printf

("msg is :%s\n"

,data.msgdata);if

(strncmp

(data.msgdata,

"quit",4

)==0)

running=0;

}if(msgctl

(msgid,ipc_rmid,0)

==-1)

exit

(exit_success)

;}

執行結果:

程序間訊息佇列通訊

要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...

程序間通訊(訊息佇列)

在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...

程序間通訊 訊息佇列

有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...