这是UNP Richard Stevens的代码副本
#include "apue.h"
#include <sys/ipc.h>
int main(int argc,char * argv[])
{
struct stat stat_buf;
if(argc != 2)
err_quit("usage ftock <pathname>");
stat(argv[1],&stat_buf);
printf("st_dev :%08lx, st_info : %08lx ,key :%08x\n",(unsigned long)stat_buf.st_dev,(unsigned long)stat_buf.st_ino,ftok(argv[1],0x57));
}
输出:
st_dev :00000803, st_ino : 018e17c3 ,key :570317c3
所以密钥取id
的8位,st_dev
的8位和st_ino
的16位。
我使用SUSE gcc。
我知道这本书有点陈旧。新工具有其新方法。
有谁能告诉我ftok
的原理有效吗?原因是从st_ino
中选择更多位?
答案 0 :(得分:1)
每个inode对于设备上的每个文件都是不同的。每个设备编号对于每个设备(分区)都是唯一的。由于每个设备的文件通常比每个系统的设备多得多,因此如果您尝试减少冲突的可能性,则使用st_ino
中的更多位而不是来自st_dev
的位是有意义的。
不幸的是,由于ftok
不保证唯一性,因此任何使用它的应用程序都必须能够容忍碰撞。据我所知,这使得它或多或少无用。
答案 1 :(得分:1)
key_t
ftok (pathname, proj_id)
const char *pathname;
int proj_id;
{
struct stat64 st;
key_t key;
if (__xstat64 (_STAT_VER, pathname, &st) < 0)
return (key_t) -1;
key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
| ((proj_id & 0xff) << 24));
return key;
}
以下是glibc 2.17的源代码。如你所见,它仍然是一样的。