關於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:
關於ftok()函式的乙個陷阱#include #include #include int main()
printf("ftok ok ,semkey = %d\n", semkey);
return 0;
}
在使用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通訊...