【问题标题】:What is the formula used to produce a ftok() key?用于生成 ftok() 密钥的公式是什么?
【发布时间】:2019-06-26 19:36:50
【问题描述】:

用于生成 ftok() 生成的密钥的公式是什么? ftok 是一个用于为 SYSTEM V IPC 创建密钥的 Linux 函数。

【问题讨论】:

  • 阅读 ftok 手册页。
  • 1.这不取决于您使用的是哪个libc吗? 2. 你为什么在乎?
  • 在 Linux 上,libc 的大多数实现都是免费软件。所以研究一下你正在使用的特定libc的源代码,可能是glibc或者musl-libc
  • ftok() 不是 Linux 特定的。它是 SysV IPC 套件的标准部分。
  • ftok 是一个用于为 SYSTEM V IPC 创建密钥的 Linux 函数。 是一个可怕的函数。选择一个随机数并希望它是唯一的,没有关于系统上已使用密钥的信息,这比自己选择一个随机数更糟糕。至少您可以实际收集有关哪些密钥已在使用中的信息。

标签: c linux sysv-ipc ftok


【解决方案1】:

ftok from glibc 2.29:

key_t
ftok (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;
}

即它通过从proj_id 的低 8 位中获取高 8 位、从提供的pathname 的设备号的低 8 位中获取第二个高 8 位和低 16 位来创建一个 32 位 key_t来自提供的pathname 的inode 编号的低16 位。

musl libc 使用相同的算法:

key_t ftok(const char *path, int id)
{
    struct stat st;
    if (stat(path, &st) < 0) return -1;

    return ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 0xffu) << 24));
}

【讨论】:

    【解决方案2】:

    glibc 库中的 ftok() 源代码为:

    #include <sys/ipc.h>
    #include <sys/stat.h>
    key_t
    ftok (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;
    }
    

    here 也可以使用其他功能。

    【讨论】:

    • 这个答案有什么意义?它只是重复了我的答案中的内容(比我早​​了一个小时)并链接到第三方网站而不是官方 glibc 代码存储库。
    • 我同意 melpomene。请不要为无用的事情浪费时间字节和网络带宽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2010-09-21
    • 2015-04-01
    • 2011-09-23
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多