程序間通訊(三) 訊息佇列

2021-07-02 04:25:24 字數 2273 閱讀 1881

一.xsi ipc基礎和特點     

每個ipc物件都有乙個唯一的識別符號,並關聯乙個唯一的鍵,相互通訊的程序必須知道這個識別符號或者鍵,根據鍵可以獲取識別符號,識別符號不是檔案描述符

每乙個ipc,都有如下一結構(l下面是inux下的結構)

/* data structure used to pass permission information to ipc operations.  */

struct ipc_perm

;         

key可以通過如下函式生成

key_t ftok(const char* path, int id);   path 是乙個存在的路徑,id可以是任意值

乙個ipc物件建立之後,物件以及其中的內容會一直存在,除非刪除或者系統重啟,

二.訊息佇列

1.int msgget(key_t key, int  flag)

根據key獲取或者建立識別符號,

flag中有 ipc_creat,表示如果不存在就建立,ipc_creat要和許可權位一起指定 如      ipc_creat | 0660       

ipc_creat 和 ipc_excl都存在表示,如果已經存在就返回-1

2.int msgsend(int msgid, const void *pstr, size_t nbytes, int flag)

傳送和接受訊息,需要定義乙個訊息結構,例如:

struct quemsg;

msgid:識別符號,pstr:結構指標,nbytes:陣列中內容的位元組數,flag:可以包含ipc_nowait表示無阻塞,如果訊息佇列已經滿了會導致阻塞

3. int msgrcv(int msgid, void *ptr, size_t nbytes, long type, int flag)

msgid:識別符號,pstr:結構指標,nbytes:陣列中可以存放的位元組數,

type:0,表示取任意型別的訊息,type>0表示取型別為type的訊息,type<0,表示取型別小於-type的訊息

flag:可以包含ipc_nowait表示無阻塞,如果訊息佇列已經滿了會導致阻塞        

測試**:

msgque_write.c:

#include

#include

#include

#include

#include

#define filepath "/tmp/text1.txt"

struct quemsg;

int main()

else

struct quemsg msg;

while(count++ < 5)

}return 0;

}msgque_read.c:

#include

#include

#include

#include

#define filepath "/tmp/text1.txt"

struct quemsg;

int main()

struct quemsg msg;

while(count++ < 5)

else

}return 0;

}msgque_read.c編譯成msgque_reader,msgque_write.c編譯成msgque_writer

[read_ng@wukong workspace]$ ./msgque_writer 

key : 17170628get msgid 32769 !

[read_ng@wukong workspace]$ ipcs -q

------ message queues --------

key        msqid      owner      perms      used-bytes   messages    

0x010600c4 32769      read_ng    660        2560         5           

[read_ng@wukong workspace]$ ./msgque_reader

recv msg:type 1,context msg ok

recv msg:type 2,context msg ok

recv msg:type 3,context msg ok

recv msg:type 4,context msg ok

recv msg:type 5,context msg ok

[read_ng@wukong workspace]$ 

程序間訊息佇列通訊

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