揭開訊息佇列相關函式ftok的真面目

2021-10-04 13:46:33 字數 1893 閱讀 8966

訊息佇列、訊號量、共享記憶體經常用在linux服務端程式設計的程序間通訊環境中,兩個程序需要通過這三種方式去通訊,那就需要約定好乙個唯一的id號來進行通訊,正好檔案的裝置編號和節點是唯一的,可對其稍加改造以產生乙個唯一的編號,這時ftok()函式剛好具備這個條件可以去幹這麼一件事情

函式原型

意義key_t ftok(const char *pathname, int id);

成功返回key_t鍵值,出錯:-1,錯誤原因存於error中 引數

意義pathname

檔名必須是存在的而且可以訪問的,與許可權無關

id稱為id子序號,只取低8位,1-255

到這裡ftok基本就介紹完了,這裡寫個demo

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

**ar**)

stat

( ar**[1]

,&stat1 )

;printf

("st_dev:%lx, st_ino:%lx, key:%x\n",(

unsigned

long

)stat1.st_dev,

(unsigned

long

)stat1.st_ino,

ftok

(ar**[1]

,0x01))

;printf

("st_dev:%lx, st_ino:%lx, key:%x\n",(

unsigned

long

)stat1.st_dev,

(unsigned

long

)stat1.st_ino,

ftok

(ar**[1]

,0x002))

;exit(0);}

以上demo的執行結果如下:

root@mcchen:

/home/ftok# ls -i ftok

1846264 ftok

root@mcchen:

/home/ftok# .

/ftok ftok

st_dev:fc01, st_ino:

1c2bf8, key:

1012bf8

st_dev:fc01, st_ino:

1c2bf8, key:

2012bf8

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

這裡就有乙個疑問,如果把pathname刪除掉然後再重新建立會怎樣,返回的key和刪除前的都一樣嗎?答案是否定的,也就是不一定

第一種情況:在arm 32位機器上執行結果截的圖,inode改變了

第二種情況:在ubuntu64位機器上執行結果,inode沒變

root@mcchen:

/home/ftok# ls -i msg1.q

1846265 msg1.q

root@mcchen:

/home/ftok# rm msg1.q

root@mcchen:

/home/ftok# touch msg1.q

root@mcchen:

/home/ftok# ls -i msg1.q

1846265 msg1.q

Linux 訊息佇列相關函式使用

訊息佇列 message queue 不在磁碟上,沒有檔名,有乙個關鍵字key可以開啟訊息佇列,訊息佇列中有很多通道,專門用來寫入 讀取資訊的。include include include int msgget key t key,int msg 建立或者開啟訊息佇列 引數一 自己指定的關鍵字ke...

vxworks訊息佇列相關函式和案例

標頭檔案 include msgqcreate 建立乙個訊息佇列 msg q id msgqcreate int maxmsgs,佇列中儲存的最大訊息數目 int maxmsglength,每個訊息的最大位元組數 int options 訊息在訊息佇列中的排列方式 options一般有兩個選項 ms...

delphi的訊息處理的相關函式

twincontrol.mainwndproc tcontrol.wndproc tobject.dispatch tobject.defaulthandler procedure twincontrol.mainwndproc var message tmessage begin try try ...