訊息佇列、訊號量、共享記憶體經常用在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 ...