1

这是来自 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

所以密钥取 8 位来自id8 位来自st_dev16 位来自st_ino

我使用 SUSE gcc 。

我知道这本书有点旧了。新工具有其新方法。

谁能告诉我 ftok 工作原理?选择更多位的原因是st_ino什么?

4

2 回答 2

1

对于设备上的每个文件,每个 inode 都是不同的。每个设备编号对于每个设备(分区)都是唯一的。由于每个设备的文件通常比每个系统的设备多得多,因此如果您要尝试减少冲突的机会,则使用来自st_ino比来自更多的位是有意义的。st_dev

不幸的是,由于ftok不能保证唯一性,任何使用它的应用程序都必须能够容忍冲突。据我所知,这使其或多或少没用。

于 2013-08-22T01:49:06.723 回答
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 的源代码。如您所见,它仍然是一样的。

于 2013-08-22T03:50:49.957 回答