有三種稱作xsi ipc的ipc:訊息佇列、訊號量以及 共享記憶體。它們只見有很多的相似之處。
訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。
訊息佇列提供了⼀一種從⼀乙個程序向另⼀乙個程序傳送⼀乙個資料塊的⽅方法。 每個資料塊都被認為是有⼀乙個型別,接收者程序接收的資料塊可以有不同的型別值。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名管道一樣,每個資料塊都有乙個最大長度的限制。linux用巨集msgmax和msgmnb來限制一條訊息的最大長度和乙個佇列的最大長度。
引數:#include
int msgget(key_t key,int flag);
key:可以認為是⼀乙個端⼜⼝口號,也可以由函式ftok⽣生成。
msg***:
ipc_creat 如果ipc不存在,則建立⼀乙個ipc資源,否則開啟操作。
ipc_excl:只有在共享記憶體不存在的時候,新的共享記憶體才建⽴立,否則就產⽣生錯誤。
如果單獨使⽤用ipc_creat,***get()函式要麼返回⼀乙個已經存在的共享記憶體的操作符,要麼返回⼀乙個新建的共享記憶體的識別符號。
如果將ipc_creat和ipc_excl標誌⼀一起使⽤用,***get()將返回⼀乙個新建的ipc識別符號;如果該ipc資源已存在,或者返回-1。
ipc_exel標誌本⾝身並沒有太⼤大的意義,但是和ipc_creat標誌⼀一起使⽤用可以⽤用來保證所得的物件是新建的,⽽而不是開啟已有的物件。
原型:
①msgrcv從佇列中取⽤用訊息
②msgsnd將資料放到訊息佇列中
引數:#include
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);
int msgsnd(int msqid, const
void *msgp, size_t msgsz, int msg***);
msqid:訊息佇列的標識碼
msgp:指向訊息緩衝區的指標,此位置⽤用來暫時儲存傳送和接收的訊息,是⼀乙個⽤使用者可定義的通⽤用結構,形態如下:
注意:第二個引數是指向乙個結構體的乙個指標,這個結構體叫做struct msgbuf這個結構體,第乙個變數是訊息的型別,第二個是存放訊息的陣列。//可自定義通用結構體
struct msgstru;
引數:
msgsz:訊息的⼤小。
msgtyp:從訊息佇列內讀取的訊息形態。如果值為零,則表⽰示訊息佇列中的所有訊息都會被讀取。
msg***:⽤用來指明核⼼心程式在佇列沒有資料的情況下所應採取的⾏行動。有兩種方式:0 和ipc_nowait
如果msg***和常數ipc_nowait合⽤用,則在msgsnd()執⾏行時若是訊息佇列已滿,則msgsnd()將不會阻塞,而會⽴立即返回-1。
如果執⾏行的是msgrcv(),則在訊息佇列呈空時,不做等待馬上返回-1,並設定錯誤碼為enomsg。
當msg***為0時,msgsnd()及msgrcv()在佇列呈滿或呈空的情形時,採取阻塞等待的處理模式。
原型:
引數:msgctl 系統調⽤用對 msgqid 標識的訊息佇列執⾏行 cmd 操作,系統定義了 3 種 cmd 操作: ipc_stat , ipc_set , ipc_rmidint
msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
ipc_stat : 該命令⽤用來獲取訊息佇列對應的 msqid_ds 資料結構,並將其儲存到 buf 指定的位址空間。
ipc_set : 該命令⽤用來設定訊息佇列的屬性,要設定的屬性儲存在buf中。
ipc_rmid : 從核心中刪除 msqid 標識的訊息佇列。
另外,學習兩條命令:
ipcs -q (檢視訊息佇列)
ipcrm -q msgid(刪除指定訊息佇列)
程序間訊息佇列通訊
要保證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 建...
程序間通訊 訊息佇列
訊息佇列 訊息佇列提供了一種從乙個程序向另乙個程序傳送資料塊的方法。每個資料塊都被認為是有乙個型別,接收者程序接收的資料塊可以有不同的型別值。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊...