代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

如果访问共享内存的密钥是shmget()的返回值,那么拥有密钥有什么意义?

  •  13
  • devoured elysium  · 技术社区  · 14 年前

    当使用共享内存时,我们为什么要关心创建密钥

    key_t ftok(const char *path, int id);
    

    在下面的代码中?

    key_t key;
    int shmid;
    
    key = ftok("/home/beej/somefile3", 'R');
    shmid = shmget(key, 1024, 0644 | IPC_CREAT);
    

    据我所知,访问给定共享内存所需的是 shmid ,不是钥匙。还是我错了?如果我们需要的是 什米德 ,不只是每次创建一个随机密钥有什么意义?

    编辑

    @ Beej's Guide to Unix IPC 人们可以阅读:

    这个怎么样 key 胡说?怎么办 我们创造了一个?好吧,既然是那种 key_t 实际上只是 long ,你可以 用你想要的任何号码。但是如果 你硬编码号码和一些 其他无关程序硬编码 同一个号码,但想要另一个队列? 解决方法是使用 ftok() 从中生成密钥的函数 两个论点。

    读到这篇文章,我会觉得需要附加到共享内存块上的东西才是关键。但这不是真的,是吗?

    3 回复  |  直到 9 年前
        1
  •  11
  •   Pushpendra ShuggyCoUk    6 年前

    是的,您需要使用shmid来访问共享内存(使用 shmat() )在你用 shmget() . 但是,您将访问的特定共享内存块基于您正在使用的密钥,即希望通过shm通信的不同进程需要使用相同的密钥。如果您只是使用一个随机数作为密钥,您可能会与其他一些不相关的程序发生冲突。

    我想建议你看看 Beej's Guide to IPC 但我知道你已经找到了:)

        2
  •  13
  •   R.. GitHub STOP HELPING ICE    14 年前

    整个系统的IPC系统充满了这样糟糕的设计。(糟糕的设计,我指的是一个共享资源的小名称空间,在那里你必须依赖于一些愚蠢的技巧,比如 ftok 为了得到一把钥匙并祈祷它不会与其他正在使用的钥匙冲突。)

    如果可能的话,我会假装它不存在,并且在任何可能的时候使用POSIX共享内存(同样是POSIX线程同步原语代替系统V信号量)。我能想到的惟一一个需要System V共享内存的实例是X共享内存映像扩展,也许还有其他X扩展。

    编辑: 为了更好地回答OP关于 ftok公司 : key_t 通常是32位的,是的,你可以自己选择一个32位的数字,但问题是人类不太可能选择所有的数字,而且碰撞的可能性太高。 ftok公司 允许您选择一个文件(打算成为应用程序唯一的文件)和一个整数,并使用所选整数散列文件的索引节点号,这将导致密钥选择在密钥空间中的分布更加均匀。当然你也可以选择一把钥匙 rand 只要您有一种方法将结果传递给需要附加共享内存的其他进程。

        3
  •  1
  •   caf    14 年前

    shmid 值仅在单个进程的上下文中有效,而 key_t 不同进程中的值将允许它们打开相同的共享内存段。

    这就是为什么你需要 钥匙 -作为命名共享内存段的跨进程方法。至于 ftok() ,正如其他答案所指出的,这被用来降低 无关的 使用相同的进程组 钥匙 价值。