程序間學習小結(訊息佇列)

2021-06-19 22:05:38 字數 1765 閱讀 2023

ipc隨程序持續、隨核心持續以及隨檔案系統持續的定義:

1. 隨程序持續:ipc一直存在到開啟ipc物件的最後乙個程序關閉該物件為止。如管道和有

名管道;

2. 隨核心持續:ipc一直持續到核心重新自舉(即重啟)或者顯示刪除該物件為止。如訊息佇列、信

號燈以及共享記憶體等;

3. 隨檔案系統持續:ipc一直持續到顯示刪除該物件為止。

訊號這種通訊方式更像"即時"的通訊方式,它要求接受訊號的程序在某個時間範圍內對訊號做

出反應,因此該訊號最多在接受訊號程序的生命週期內才有意義,訊號所傳遞的資訊是接近

於隨程序持續的概念(process-persistent),管道及有名管道及有名管道則是典

型的隨程序持續ipc,並且,只能傳送無格式的位元組流無疑會給應用程式開發帶來不便,另

外,它的緩衝區大小也受到限制。

目前主要有兩種型別的訊息佇列:posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前

被大量使用。考慮到程式的可移植性,新開發的應用程式應盡量使用posix訊息佇列。主流linux發行版本之一redhad8.0(核心2.4.18),還沒有提供對posix程序間通訊api的支援,不過應該只是時間上的事。

因此,本文將主要介紹系統v訊息佇列及其相應api。系統中記錄訊息佇列的資料結構(struct ipc_ids

msg_ids)位於核心中,系統中的所有訊息佇列都可以在結構msg_ids中找到訪問入口。

一:基本概念

struct ipc_ids msg_ids是核心中記錄訊息佇列的全域性資料結構;struct msg_queue

是每個訊息佇列的佇列頭。訊息佇列就是乙個訊息的鍊錶。每個訊息佇列都有乙個佇列頭,用結構struct

msg_queue來描述。佇列頭中包含了該訊息佇列的大量資訊,包括訊息佇列鍵值、使用者id、組id、訊息佇列中訊息數目等等,甚至記錄了最近對訊息佇列讀寫程序的id。讀者可以訪問這些資訊,也可以設定其中的某些資訊。

結構msg_queue用來描述訊息佇列頭,存在於系統空間:

struct msg_queue ;

每個struct kern_ipc_perm能夠與具體的訊息佇列對應起來是因為在該結構中,有乙個key_t 型別成員key,而key 則唯一確定乙個訊息佇列。kern_ipc_perm結構如下:

struct kern_ipc_perm

二:訊息佇列的操作

#include

#include

#include

如果要檢視errno錯誤資訊,還需要#include

1:開啟或建立訊息佇列

訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得一

個訊息佇列的描述字,只需提供該訊息佇列的鍵值即可;

注:訊息佇列描述字是由在系統範圍內唯一的鍵值生成的,而鍵值可以看作對應系統內的一

條路徑。

1)int msgget(key_t key, int msg***)

引數key是乙個鍵值,由ftok獲得(key_t ftok (char*pathname, char proj);它返回與路徑pathname相對應的乙個鍵值key=ftok(path_ptr, 'a');注:key也可以自己定義乙個值(只是看程式見過這麼做,沒見到書上說過),不同訊息佇列的key不同,相應的msqid也不同);msg***引數是一些標誌位。該呼叫返回與健值key相對應的

訊息佇列描述字。

在以下兩種情況下,該呼叫將建立乙個新的訊息佇列:

程序間訊息佇列通訊

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