一,前言
使用訊號和管道進行程序通訊存在一定的限制。例如,使用訊號傳遞的資訊有限,使用管道雖然能夠傳輸一定量的資訊,但是只能傳輸無格式的位元組流。為了解決這些問題,20世紀70年代,at&t發行的system v版本的unix中引入了3中新的程序間通訊(ipc)機制,分別是:訊息佇列、共享記憶體和訊號量。在posix標準中,這些程序間通訊機制被編入posix:xsi中。linux系統支援posix標準,自然就支援這幾種(ipc)機制。
二,基本概念
1、訊息佇列簡介
顧名思義,訊息佇列指的是存放訊息的佇列。訊息是指有訊息型別和資料的資訊,這些資訊被存放在預先定義的訊息結構中。訊息型別可以是私有的(只用於建立訊息佇列的程序及其子程序訪問),也可以是共有的(能夠被系統中所有的程序訪問)。要讓系統中其他程序訪問,必須通過乙個唯一的標識,這個標識在訊息佇列中稱為訊息的key。不同程序通過向訊息佇列中寫入訊息或讀取訊息來實現程序間的資料交換。
2、訊號量簡介
訊號量用於多程序情況下的程序同步問題。訊號量是乙個含有整數值的資源,程序通過檢測該整數值,來保證其他程序在某個時間不會進行類似的操作。
3、共享記憶體簡介
在linux系統中,每個程序都執行在自己的虛擬位址空間中。程序之間是不能夠訪問其他程序的位址空間的。共享記憶體通過建立一段充許其他程序訪問的記憶體空間,實現資源和資料的共享。程序可以對共享記憶體空間進行讀寫操作。當多個程序同時進行寫操作時,需要使用訊號量控制對資源的訪問。
posix ipc提供的這3種ipc通訊機制都只能用於本機之間的程序通訊。要實現不同主機之間的程序通訊,可以使用socket套接字或rpc等方式。
三,ipc資源
訊息佇列、訊號量和共享記憶體都是ipc資源,而在使用ipc資源前,需要建立該資源。與檔案屬性中有檔案所有者、訪問許可權等資訊類似,ipc資源也具體類似的屬性。這些屬性被儲存在結構體ipc_perm中,包含ipc關鍵字、ipc資源的擁有者和同組使用者等資訊。
struct ipc_perm ;
四,ipc識別符號與關鍵字
在linux核心中,為了標識ipc資源,使用了乙個非負整數的識別符號。只要通過該識別符號就可以訪問與識別符號相關的ipc資源,如訊息佇列、訊號量或共享記憶體。這一標識被稱為ipc識別符號。
要建立ipc識別符號,需要指定乙個關鍵字。ipc關鍵字(ipc_perm結構體中的__key)可以通過呼叫ftok函式獲得。ftok函式的具體資訊如下表所示:
ftok函式
標頭檔案#include
#include
函式原型
key_t ftok(const char *pathname, int proj_id);
返回值 成功
失敗是否設定errno
產生的ipc關鍵字 -1
是 說明:ftok函式將給定的pathname和proj_id轉換成ipc關鍵字。引數pathname必須指向檔案系統中存在的檔案或目錄。
錯誤資訊:
eacces:無許可權進入pathname中的目錄。
eloop:解析pathname時存在迴圈。
enametoolong:pathname長度超過path_max限定,或路徑中某個目錄長度超過了name_max限定。
enoent:pathname中的某個目錄為空。
enotdir:pathname中含有非目錄部分。
例項:
#include #include #include int main(void)
printf("proj_id = %d pathname = %s ipc key = %d\n", proj_id, pathname, key);
proj_id = 2;
key = ftok(pathname, proj_id);
if (key == -1)
printf("proj_id = %d pathname = %s ipc key = %d\n", proj_id, pathname, key);
return (0);
}
執行結果:
[root@localhost test]# ./ftok
proj_id = 1 pathname = ./program ipc key = 16912503
proj_id = 2 pathname = ./program ipc key = 33689719
五,基本ipc命令
為了方便地使用ipc通訊機制實現程序間的通訊,在posix:xsi中還定義了檢視和刪除ipc資源的命令。ipcs命令提供了檢視核心中儲存的ipc資源的方法,而ipcrm用於從核心中刪除指定的ipc資源。
1、ipcs命令
ipcs命令用於顯示系統中與posix:xsi程序間通訊相關的資源資訊。ipcs命令常用的引數有q(顯示訊息佇列資訊)、s(顯示訊號量資訊)和m(顯示共享記憶體資訊)。如果不帶任何引數執行ipcs命令,將會顯示訊息佇列、訊號量和共享記憶體三者的資訊。
2、ipcrm命令
posix標準還提供了從核心中刪除ipc資源的系統呼叫,使用ipcrm可以手工移除ipc資源。
從幫助資訊中可以了解到ipcrm的各種使用引數,如下表所示:
引數 說明
引數 說明
-q msqid
移除msqid為指定值的訊息佇列資源
-q mskey
移除key為mskey的訊息佇列資源
-m shmid
移除shmid為指定值的共享記憶體資源
-m shmkey
移除key為shmkey的共享記憶體資源
-s semid
移除semid為指定值的訊號量資源
-s semkey
移除key為semkey的訊號量資源
在實際使用中,往往需要將ipcs和ipcrm配合起來使用。刪除系統中的訊息佇列資源的具體步驟如下:
(1):使用ipcs檢視系統中ipc資源的情況
(2):根據顯示的msqid或key資訊,使用ipcrm刪除指定的資源。
基本概念 C 基本概念
由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...
基本概念 數控系統基本概念
第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...
XSLT基本概念
我們首先來澄清乙個概念,大家可能聽說過xsl extensible stylesheet language xsl和我們這裡說的xslt從狹義上理解是一樣的,而按照w3c的標準,xslt的說法更嚴格些,因此我們在文章中統一使用xslt的稱法。它們之間具體的關係我們會在下面講述。1.1 什麼是xslt...