ftok 函式深度解析

2021-07-10 05:03:47 字數 2473 閱讀 5139

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

key_t ftok(const char *pathname, int proj_id);

其中引數fname是指定的檔名,這個檔案必須是存在的而且可以訪問的。id是子序號,它是乙個8bit的整數。即範圍是0~255。當函式執行成功,則會返回key_t鍵值,否則返回-1。在一般的unix中,通常是將檔案的索引節點取出,然後在前面加上子序號就得到key_t的值。

有關該函式的三個常見問題:

1.pathname是目錄還是檔案的具體路徑,是否可以隨便設定

2.pathname指定的目錄或檔案的許可權是否有要求

3.proj_id是否可以隨便設定,有什麼限制條件

解答:

1、

ftok根據路徑名,提取檔案資訊,再根據這些檔案資訊及project id

合成key,該路徑可以隨便設定。

2、該路徑是必須存在的,f

tok只是根據檔案inode在系統內的唯一性來取乙個數值,和檔案的許可權無關。

3、proj_id是可以根據自己的約定,隨意設定。這個數字,有的稱之為project id; 在unix系統上,它的取值是1到255;

簡單驗證:

用到的**,檔案wxyuan.c:

#include #include #include int main()  

printf("ftok ok ,semkey = %d\n", semkey);

return 0;

}

關於ftok()函式的乙個陷阱

在使用ftok()函式時,裡面有兩個引數,即fname和id,fname為指定的檔名,而id為子串行號,這個函式的返回值就是key,它與指定的檔案的索引節點號和子串行號id有關,這樣就會給我們乙個誤解,即只要檔案的路徑,名稱和子串行號不變,那麼得到的key值永遠就不會變。

事實上,這種認識是錯誤的,想想一下,假如存在這樣一種情況:在訪問同一共享記憶體的多個程序先後呼叫ftok()時間段中,如果fname指向的檔案或者目錄被刪除而且又重新建立,那麼檔案系統會賦予這個同名檔案新的i節點資訊,於是這些程序呼叫的ftok()都能正常返回,但鍵值key卻不一定相同了。由此可能造成的後果是,原本這些程序意圖訪問乙個相同的共享記憶體物件,然而由於它們各自得到的鍵值不同,實際上程序指向的共享記憶體不再一致;如果這些共享記憶體都得到建立,則在整個應用執行的過程中表面上不會報出任何錯誤,然而通過乙個共享記憶體物件進行資料傳輸的目 的將無法實現。

這是乙個很重要的問題,希望能謹記!!!

所以要確保key值不變,要麼確保ftok()的檔案不被刪除,要麼不用ftok(),指定乙個固定的key值。

ubuntu下,ftok()產生鍵值的原理:

#include #include #include int main()

printf( "the file info: ftok( filename, 0x27 ) = %x, st_ino = %x, st_dev= %x\n", ftok( filename, 0x27 ), buf.st_ino, buf.st_dev );

return 0;

}

執行該原始碼:

satellite@ubuntu:~/test$ ./wxyuan

the file info: ftok( filename, 0x27 ) = 27012eef, st_ino = e2eef, st_dev= 801

通過執行結果可看出,ftok獲取的鍵值是由ftok()函式的第二個引數的後8個bit,st_dev的後兩位,st_ino的後四位構成的。

有關 st_dev和

st_ino的定義如下:

函式:int stat( const char *file_name, struct stat *buf )

函式說明:通過檔名filename,獲取檔案資訊,並儲存在buf所指的結構體stat中。

返回值:成功執行返回0,失敗返回-1,錯誤**存於errno

struct stat結構體的定義如下:

/usr/include/asm/stat.h

struct stat ;

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函式的使用

1 ipcs 檢視當前系統中所有建立的ipc物件 2 ipcs q 檢視建立的訊息佇列 3 ipcs m 檢視建立的共享記憶體段 4 ipcs s 檢視建立的訊號量陣列 5 ipcrm 刪除ipc物件 例如 ipcrm q msqid 刪除標號為msqid的訊息佇列 system v提供的ipc通訊...