您好,登錄后才能下訂單哦!
這篇文章主要講解了“ftok()函數的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ftok()函數的用法”吧!
關于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、該路徑是必須存在的,ftok只是根據文件inode在系統內的唯一性來取一個數值,和文件的權限無關。
3、proj_id是可以根據自己的約定,隨意設置。這個數字,有的稱之為project ID; 在UNIX系統上,它的取值是1到255;
關于ftok()函數的一個陷阱
在使用ftok()函數時,里面有兩個參數,即fname和id,fname為指定的文件名,而id為子序列號,這個函數的返回值就是key,它與指定的文件的索引節點號和子序列號id有關,這樣就會給我們一個誤解,即只要文件的路徑,名稱和子序列號不變,那么得到的key值永遠就不會變。
事實上,這種認識是錯誤的,想想一下,假如存在這樣一種情況:在訪問同一共享內存的多個進程先后調用ftok()時間段中,如果fname指向的文件或者目錄被刪除而且又重新創建,那么文件系統會賦予這個同名文件新的i節點信息,于是這些進程調用的ftok()都能正常返回,但鍵值key卻不一定相同了。由此可能造成的后果是,原本這些進程意圖訪問一個相同的共享內存對象,然而由于它們各自得到的鍵值不同,實際上進程指向的共享內存不再一致;如果這些共享內存都得到創建,則在整個應用運行的過程中表面上不會報出任何錯誤,然而通過一個共享內存對象進行數據傳輸的目 的將無法實現。
這是一個很重要的問題,希望能謹記!!!
所以要確保key值不變,要么確保ftok()的文件不被刪除,要么不用ftok(),指定一個固定的key值。
感謝各位的閱讀,以上就是“ftok()函數的用法”的內容了,經過本文的學習后,相信大家對ftok()函數的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。