C 选择共享内存或unix信号量键的惯用方法

C 选择共享内存或unix信号量键的惯用方法,c,unix,shared-memory,semaphore,C,Unix,Shared Memory,Semaphore,为shmget或semget函数选择键的惯用方法是什么 如何确保其他进程不使用相同的密钥 对。我知道一个大的随机数很可能不会被其他人使用,但是有没有一种防弹的方法来选择它呢?也许你知道有一个函数ftok可以让你从文件路径中获取密钥。因此,拥有“个人”密钥的问题是查找“个人”文件。它保证为不同的文件提供不同的密钥。习惯用法可以是创建一个临时文件(借助于tmpnam?),或者创建一个隐藏在某个私有目录中的文件,并将其与ftok一起使用。在分配共享内存或信号量时,首先使用标志IPC\u create和

shmget
semget
函数选择键的惯用方法是什么

如何确保其他进程不使用相同的密钥


对。我知道一个大的随机数很可能不会被其他人使用,但是有没有一种防弹的方法来选择它呢?

也许你知道有一个函数
ftok
可以让你从文件路径中获取密钥。因此,拥有“个人”密钥的问题是查找“个人”文件。它保证为不同的文件提供不同的密钥。习惯用法可以是创建一个临时文件(借助于
tmpnam
?),或者创建一个隐藏在某个私有目录中的文件,并将其与
ftok
一起使用。在分配共享内存或信号量时,首先使用标志
IPC\u create
IPC\u EXCL
。如果已存在具有给定密钥的共享内存段,则
shmget
命令将失败。反复尝试使用新的随机键获取共享内存段,直到成功


现在,您必须找出将您使用的密钥传达给其他流程的方法。正如你建议使用随机数一样,我认为你有这样的方法。

是的,这是我想的方法,但对我来说似乎太老练了。创建一个文件(ftok要求真实存在的文件)只是为了得到一个密钥,这不是有点奇怪吗?但看起来这是最好的选择。别让我觉得太粗俗了,毕竟已经有一个空间有唯一的ID,为什么不把它用于多种用途呢?而且一个空文件占用的空间和cpu时间非常少……请注意,ftok(自然)不能保证不同文件(和proj_id)的值不同,只能保证相同文件的值相同。同时存在的文件的值不同只是手册页中的一个“应该”。错误,打开组:ftok()函数在使用相同id值调用时,应为命名相同文件的所有路径返回相同的键值,当使用不同的id值调用时,或者使用命名同一文件系统上同时存在的不同文件的路径调用时,返回不同的键值。这也只是一个“应”。一旦您有超过2^24个文件(32位密钥减去8位项目ID),就无法保证这一点。考虑到设备ID可能也起了作用(手册页显示),少于2^24个文件就足够了,可能只有2^16个文件就足够了(我的系统当前在
/
上有~2^20个文件,新的debian大约有2^14个),因此必须存在冲突。而且,只有inode按顺序分配并在释放时重新使用。ftok是一个32位的散列函数,因此会发生冲突,必须做好准备。