ftok函式
系統建立IPC通訊 (訊息佇列、信號量和共享記憶體) 時必須指定一個ID值。通常情況下,該id值通過ftok函式得到。
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。
查詢檔案索引節點號的方法是: ls -i
當刪除重建檔案後,索引節點號由作業系統根據當時檔案系統的使用情況分配,因此與原來不同,所以得到的索引節點號也不同。
如果要確保key_t值不變,要么確保ftok的檔案不被刪除,要么不用ftok,指定一個固定的key_t值,比如:
#define IPCKEY 0x111
char path[256];
sprintf( path, "%s/etc/config.ini", (char*)getenv("HOME") );
msgid=ftok( path, IPCKEY );[/code]
同一段程式,用於保證兩個不同用戶下的兩組相同程式獲得互不干擾的IPC鍵值。
由於etc/config.ini(假定)為套用系統的關鍵配置檔案,因此不存在被輕易刪除的問題——即使被刪,也會很快被發現並重建(此時套用系統也將被重啟)。
ftok()的設計目的也在於此。