linux 中ftok函數的用法
1、函數作用: 系統建立IPC通訊(如消息隊列、共享內存時)必須指定一個ID值。通常情況下,該id值通過ftok函數得到
2、函數原型:
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
3、函數參數解析:
a、const char *pathname:用於產生key_t值的文件名(文件必須存在),
b、int proj_id:proj_id是子序號,雖然爲int,但是隻有8個比特被使用(0-255)
4、返回值
當成功執行的時候,一個key_t值將會被返回,否則 -1 被返回。
5、函數內部實現過程
在一般的UNIX實現中,是將文件的索引節點號取出,前面加上子序號得到key_t的返回值。
如指定文件的索引節點號爲65538,換算成16進製爲 0x010002,而你指定的ID值爲38,
換算成16進製爲0x26,則最後的key_t返回值爲0x26010002。
注意:
1、假如要確保key_t值不變,要目確保ftok的文檔不被刪除 ,要麼不用ftok,指定一個固定的key_t值。
2、另外說一句:在aix等操作系統上,有多個文檔系統,會出現分佈在不同的文檔系統上的兩個文檔具備相同的索引節點號,
此時用ftok對這兩個文檔進行操 作,只要id參數不變,得到的key_t值相同,造成創建消息隊列失敗。但是這種情況相當少見罷了。
因爲在開發中涉及多種系統平臺,在系統移植時發現ftok()函數在不同平臺下存在一定的差異性。
當然,根本原因不在於ftok()本身,而應該是 操作系統對於文件系統管理的差異性。
6、測試用例:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/ipc.h>
int main(int argc,char *argv[])
{
key_t key;
if(3 != argc)
{
printf("usage:ftok <patname> <pri_id>\n");
exit(1);
}
key = ftok(argv[1],atoi(argv[2]));
printf("key = %x\n",key);
return 0;
}