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