key t IPC鍵和ftok函式詳解和剖析

2021-06-09 11:11:45 字數 1743 閱讀 8483

統建立ipc通訊(如訊息佇列、共享記憶體時)必須指定乙個id值。通常情況下,該id值通過ftok函式得到。

ftok原型如下:

key_t ftok( char * fname, int id )

fname就時你指定的檔名(該檔案必須是存在而且可以訪問的),id是子序號,雖然為int,但是只有8個位元被使用(0-255)。

當成功執行的時候,乙個key_t值將會被返回,否則 -1 被返回。

在一般的unix實現中,是將檔案的索引節點號取出,前面加上子序號得到key_t的返回值。如指定檔案的索引節點號為65538,換算成16進製為 0x010002,而你指定的id值為38,換算成16進製為0x26,則最後的key_t返回值為0x26010002。

查詢檔案索引節點號的方法是: ls -i

例如:

#include        "unpipc.h"

int main(int argc, char **argv)

程式執行結果:

[cbs@linux svipc]$ ./ftok  /tmp/mysql.sock

st_dev: 802, st_ino: 34219, key: 57024219

ftok的典型實現呼叫stat函式,然後組合以下三個值:

1.pathname所在的檔案系統的資訊(stat結構的st_dev成員)

2.該檔案在本檔案系統內的索引節點號(stat結構的st_ino成員)

3. proj_id的低序8位(不能為0)

從程式執行的結果可以看出,ftok呼叫返回的整數ipc鍵由proj_id的低序8位(57),st_dev成員的低序8位(02),st_info的低序16位組合而成(4219)。

注:兩程序如在pathname和proj_id上達成一致(或約定好),雙方就都能夠通過呼叫ftok函式得到同乙個ipc鍵。

那麼ftok是怎麼實現的呢?《unix網路程式設計》上講到,ftok的實現是組合了三個值:

具體如何組合的,根據系統實現而不同。

使用ftok()需要注意的問題:

附:檔案屬性結構struct stat

;

獲取檔案屬性的函式有如下幾個:

int stat(const char *file_name, struct stat *buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *file_name, struct stat *buf);

下面通過例子來看一下如何獲取:

#include

#include

#include

#include

#include

int main()

編譯並執行輸出:

$ gcc -o getstat main.c

$ ./getstat

檔案所在裝置編號:2051

檔案所在檔案系統索引:61079722

檔案的型別和訪問的許可權:33188

連到該檔案的硬連線數目:1

檔案所有者的使用者識別碼:502

檔案所有者的組識別碼:503

裝置裝置檔案:0

檔案大小:1210

檔案系統的i/o緩衝區大小:4096

占用檔案區塊的個數(每一區塊大小為512個位元組):8

ftok函式用法

系統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名 該檔案必須是存在而且可以訪問的 id是子序號,雖然為int,但是只有8個位元被使用 0 ...

系統函式ftok

系統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名,id是子序號。在一般的unix實現中,是將檔案的索引節點號取出,前面加上子序號得到key...

ftok 函式深度解析

關於ftok函式,先不去了解它的作用來先說說為什麼要用它,共享記憶體,訊息佇列,訊號量它們三個都是找乙個中間介質,來進行通訊的,這種介質多的是。就是怎麼區分出來,就像唯一乙個身份證來區分人一樣。你隨便來乙個就行,就是因為這。只要唯一就行,就想起來了檔案的裝置編號和節點,它是唯一的,但是直接用它來作識...