2

我试图了解使用相同的 System Vkey_t值来分配共享内存缓冲区 viashmget()和信号量 via的含义semget()。这是否存在任何冲突,即我应该为共享内存缓冲区和信号量分配一个单独的键值吗?或者信号量和共享内存是否不同?也许它们是不同的,但在某种程度上相关?换句话说,如果同时调用semget(0x1000, 1, IPC_CREAT|0660)and会发生什么shmget(0x1000, 1, IPC_CREAT|0660)

我知道键是系统范围的值。我也明白这ftok()是产生key_t价值的标准方式,但这不在我的控制之下。

上下文:我编写了一些处于高级开发状态的代码,它调用使用 System V IPC shmget/构建的例程semget。我的代码使用固定的信号量 ID(在内部转换为键),事实证明,它与在其他地方使用的固定共享内存 ID(也在内部转换为键)具有相同的数值。直接的问题是,我是否需要修改我的代码以在信号量和共享内存缓冲区中分配唯一 ID,或者保持原样(仅在信号量中唯一);更大的问题是,这是我未来需要注意的一个警告。使用当前代码,没有错误,到目前为止的测试也没有发现任何问题,但这并不意味着不会出错。

4

1 回答 1

0

考虑到它们使用相同的密钥空间,很可能存在一个实现,其中 semget 在 shmget 之上实现,或者在两者使用相同密钥时存在互操作性问题。在这种情况下,如果文档是可靠的,那么IPC_CREAT会注意到其中一个并出错,以便您处理这种情况。

同样不使用ftok()确实会让您更容易与正在使用的人发生碰撞ftok();但ftok()无论如何,这只是统计上的唯一性。

于 2021-08-05T02:36:22.150 回答