这是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中选择更多的位?

最佳答案

对于设备上的每个文件,每个inode都是不同的。每个设备编号对于每个设备(分区)都是唯一的。由于每个设备的文件通常比每个系统的设备多得多,因此如果您试图减少冲突的可能性,那么使用st_ino中的比st_dev中的更多位是有意义的。
不幸的是,由于ftok不能保证唯一性,因此任何使用它的应用程序无论如何都必须能够容忍冲突。据我所知,这或多或少使它变得毫无用处。

10-07 15:06