用于生成ftok()生成的键的公式是什么?ftok是一个linux函数,用于为system v ipc创建密钥。

最佳答案

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;
}

也就是说,它通过从key_t的较低8位中获取较高的8位,从所提供的proj_id的设备号的较低8位中获取第二个较高的8位,从所提供的pathname的inode号的较低16位中获取较低的16位来创建32位pathname
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));
}

09-06 08:49