日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

使用 UNIX System V IPC 機(jī)制共享應(yīng)用程序數(shù)據(jù)

引言
Unix 內(nèi)核管理的進(jìn)程自主地操作,從而產(chǎn)生更穩(wěn)定的系統(tǒng) 。然而,每個(gè)開(kāi)發(fā)人員最終都會(huì)遇到這樣的情況,即其中一組進(jìn)程需要與另一組進(jìn)程通信,也許是為了交換數(shù)據(jù)或發(fā)送命令 。這種通信稱(chēng)為進(jìn)程間通信(Inter-Process Communication,IPC) 。System V (SysV) UNIX 規(guī)范描述了以下三種 IPC 機(jī)制,它們統(tǒng)稱(chēng)為 SysV IPC:
消息隊(duì)列
信號(hào)量
共享內(nèi)存
此外,進(jìn)程還可以通過(guò)其他機(jī)制通信,例如:
讀、寫(xiě)和鎖定文件
信號(hào)
套接字
管道
FIFO(先進(jìn)先出)
這后一組機(jī)制一般也稱(chēng)為 IPC 。由于其簡(jiǎn)單性和有效性,本文將集中于 SysV IPC 方法 。
了解 SysV 模型
三種 SysV IPC 方法具有類(lèi)似的語(yǔ)法,盡管它們具有不同的用途 。一般情況下,它們執(zhí)行以下操作:
確定要用于 ftok(3) 的正確 IPC 密鑰 。
分別使用 msgget(2)、semget(2) 或 shmget(2) 獲得用于消息隊(duì)列、信號(hào)量或共享內(nèi)存的特定于 IPC 的標(biāo)識(shí)符,這些標(biāo)識(shí)符與 IPC 密鑰相關(guān)聯(lián) 。
使用 msgctl(2)、semctl(2) 或 shmctl(2) 修改 IPC 實(shí)例的屬性 。
利用特定的 IPC 實(shí)例 。
最后,使用 msgctl(2)、semctl(2) 或 shmctl(2) 和 IPC_RMID 標(biāo)志銷(xiāo)毀 IPC 實(shí)例 。
每個(gè) IPC 實(shí)例都被賦予一個(gè)標(biāo)識(shí)符,以將它與系統(tǒng)上存在的其他 IPC 實(shí)例區(qū)分開(kāi)來(lái) 。例如,兩個(gè)不同的應(yīng)用程序可能分別決定使用共享內(nèi)存段,因此系統(tǒng)范圍的 IPC ID 將區(qū)分這兩個(gè)實(shí)例 。雖然可能不是那么明顯,但是第一個(gè)挑戰(zhàn)就是弄清如何分發(fā)這樣的信息:即如何在沒(méi)有準(zhǔn)備某種 IPC 機(jī)制的情況下附加到一個(gè)公共 IPC 實(shí)例 。
ftok 庫(kù)調(diào)用使用某個(gè)給定文件中的索引節(jié)點(diǎn)信息和一個(gè)唯一標(biāo)識(shí)符來(lái)得出一個(gè)密鑰,只要該文件存在并且該標(biāo)識(shí)符為常量,此密鑰就保持相同 。因此,兩個(gè)進(jìn)程可以使用它們的配置文件和編譯時(shí)常量來(lái)得出相同的 IPC 密鑰 。常量的存在允許同一個(gè)應(yīng)用程序通過(guò)改變常量來(lái)創(chuàng)建 IPC 機(jī)制的多個(gè)實(shí)例 。
在一組進(jìn)程獨(dú)立得出各自的 IPC 密鑰之后,它們必須使用某個(gè) get 系統(tǒng)調(diào)用來(lái)獲得與該特定 IPC 實(shí)例關(guān)聯(lián)的特定標(biāo)識(shí)符 。各個(gè) get 調(diào)用全都需要 IPC 密鑰和一組標(biāo)志,以及一些信號(hào)量和共享內(nèi)存大小信息 。由于 Unix 是多用戶(hù)系統(tǒng),標(biāo)志將包括熟悉的八進(jìn)制形式的文件權(quán)限(因此 666 意味著任何人都可以執(zhí)行讀和寫(xiě)) 。如果還設(shè)置了 IPC_CREAT 標(biāo)志,則會(huì)在 IPC 實(shí)例不存在時(shí)創(chuàng)建該實(shí)例 。如果沒(méi)有設(shè)置 IPC_CREAT 標(biāo)志并且還未創(chuàng)建 IPC 實(shí)例,則 get 調(diào)用將返回錯(cuò)誤 。
對(duì)于能夠自己分發(fā) IPC 實(shí)例標(biāo)識(shí)符的應(yīng)用程序,存在一種用于執(zhí)行該任務(wù)的更簡(jiǎn)單方法 。如果您在調(diào)用 get 以創(chuàng)建 IPC 時(shí)使用密鑰 IPC_PRIVATE,則實(shí)例標(biāo)識(shí)符將是唯一的 。需要附加到該 IPC 的其他進(jìn)程不需要調(diào)用 get,因?yàn)樗鼈円呀?jīng)擁有該標(biāo)識(shí)符 。
一旦擁有了標(biāo)識(shí)符,應(yīng)用程序就可以任意使用 IPC 實(shí)例 。每種 IPC 方法都是不同的,并在它們各自的部分中進(jìn)行處理 。
通過(guò)隊(duì)列傳遞消息
消息隊(duì)列提供了一種機(jī)制,使得一個(gè)進(jìn)程可以發(fā)送另一個(gè)進(jìn)程能夠獲得的消息 。在獲得該消息之后,將從隊(duì)列中刪除該消息 。消息隊(duì)列非常獨(dú)特,因?yàn)閮蓚€(gè)進(jìn)程不必同時(shí)存在——一個(gè)進(jìn)程可以發(fā)送一個(gè)消息并退出,而該消息可以在數(shù)天后才被另一個(gè)進(jìn)程獲得 。
消息必須由一個(gè)長(zhǎng)整數(shù)后面跟著消息數(shù)據(jù)組成 。清單 1 顯示了 C 語(yǔ)言中的這樣一個(gè)結(jié)構(gòu),其中使用了一個(gè) 100 字節(jié)的消息 。
清單 1. 示例消息的 C 語(yǔ)言定義
struct mq_message {
long type; /* The type or destination */
char text[100]; /* Data */
};
消息接收者使用消息類(lèi)型 。當(dāng)從隊(duì)列輪詢(xún)消息時(shí),您可以選擇第一個(gè)可用的消息,或者可以查找某種特定的消息類(lèi)型 。將要使用的消息類(lèi)型特定于應(yīng)用程序,從而使得隊(duì)列獨(dú)特于其他形式的 IPC,因?yàn)閮?nèi)核通過(guò)讀取 type 字段,從而在一定程度上了解所傳遞的應(yīng)用程序數(shù)據(jù) 。

推薦閱讀