首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IPC键从st_dev中选择8位,从st_ino中选择16位。

IPC键从st_dev中选择8位,从st_ino中选择16位。
EN

Stack Overflow用户
提问于 2013-08-22 01:28:16
回答 2查看 111关注 0票数 1

这是UNP Richard Stevens的代码副本。

代码语言:javascript
运行
复制
   #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));
   }

输出:

代码语言:javascript
运行
复制
st_dev :00000803, st_ino : 018e17c3 ,key :570317c3

所以键从id取8位,从st_dev取8位,从st_ino取16位。

我用的是苏gcc。

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

有人能告诉我ftok的工作原理吗?为什么要从st_ino中选择更多位呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-22 01:49:06

每个inode对于设备上的每个文件都是不同的。每个设备编号对于每个设备(分区)是唯一的。由于每个设备的文件通常比每个系统的设备多得多,如果您试图降低碰撞的可能性,从st_ino中使用更多的位要比从st_dev中使用更多的位是有意义的。

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 03:50:49

代码语言:javascript
运行
复制
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的源代码。正如你所看到的,它仍然是一样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18370257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档