1. 程式人生 > >程序通訊中鍵值和識別符號的關係

程序通訊中鍵值和識別符號的關係

在建立一個訊息佇列(其他ipc相同)時,需要先通過檔案路徑名和專案ID獲取一個鍵值,然後通過此鍵值由核心生成識別符號,在以後可通過此識別符號來使用此訊息佇列。
為什麼要有鍵值和識別符號兩個值呢?
        描述符是對於使用者操作而言的,讓使用者感覺操作和對檔案的操作相同,鍵是對於系統內部說的。

 我們使用ftok來建立鍵值,具體你可以man一下fotk函式,大概是這樣的:按給定的路徑名取得其stat結構,從該結構中取出部分st_dev和st_ino欄位,然後再與專案id組合起來,如果兩個路徑名引用兩個不同的檔案,那麼,對這兩個路徑名呼叫ftok通常返回不同的鍵,但是,因為i節點號和鍵通常都存放在長整型中,於是建立鍵時可能會丟失資訊,這意味著,如果使用同一專案id,那麼對於不同檔案的兩個路徑名可能產生相同的鍵。而識別符號是唯一確定的,可以用來區別於其他ipc的。

fotk函式

系統建立IPC通訊 (訊息佇列、訊號量和共享記憶體) 時必須指定一個ID值。通常情況下,該id值通過ftok函式得到。

標頭檔案
#include <sys/types.h>
#include <sys/ipc.h>
函式原型:
key_t ftok( const char * fname, int id )
fname就是你指定的檔名(已經存在的檔名),一般使用當前目錄,如:
key_t key;
key = ftok(".", 1); 這樣就是將fname設為當前目錄。
id是子序號。雖然是int型別,但是隻使用8bits(1-255)。
在一般的UNIX實現中,是將檔案的索引節點號取出,前面加上子序號得到key_t的返回值。
如指定檔案的索引節點號為65538,換算成16進製為0x010002,而你指定的ID值為38,換算成16進製為0x26,則最後的key_t返回值為0x26010002。