希望我的问题有意义:
使用C语言进行编程,我能否在共享内存段中创建哈希表,以便任何具有适当权限的进程可以访问其中的键/值?
如果可以,如何在哈希表创建时指定将其放置在SHM中?是否有建议的哈希表实现允许这样做?
非常感谢。
就我所知,没有任何库可以做到这一点。
我知道,如果你编写自己的库或修改现有的库,需要解决的棘手问题是跟踪并修复使用指针的任何代码,并将其替换为使用基础 + 偏移量的代码。
基础是由共享内存创建/打开函数返回的指针,在每个进程中都会不同。偏移量替换了指针。当您需要通过偏移量定位值时,将基础转换为char*
,添加偏移量,然后将其转换为your_type*
。类似于(bucket_t*)((char*)base + offset)
。
这是假设您的哈希实现需要指针。如果它们仅使用单值桶和没有值列表,则不需要。
另一个棘手的问题是您需要自己管理内存。而不是调用malloc(),您可以制作自己的函数,可能称之为shm_hash_alloc()。快速启动只需保留指针并在分配内存时将其增加,而不必担心释放它。稍后,您可以使用指针(偏移量)数组来释放各种大小的列表,或者如果您知道对象类型,则为每种类型使用一个列表。在每个空闲块中,您存储下一个空闲块的指针,并且由于其所在的列表,您知道其大小。甚至有更高级的方法,但您可能不需要。
shmht.c
中 shmht_insert()
函数的 key_size
类型是 unsigned int
,但在 shmht.h
中是 size_t
,这导致我的编译器报错... - felix021哈希表只是一种数据结构。只要访问共享内存的模块知道如何构建这个结构,它们就可以访问它。无论你使用哪种实现方式,只要涉及到的所有模块都知道如何读取它即可。
可以将其视为一份报纸。您创建自己的私有内存段 - 这是一个本地报纸。然后您想与周围所有城镇分享它 - 只要人们说同样的语言并且能够阅读它即可。没有特殊的语言用于共享,它只需要是每个人都能理解的语言。
在您的情况下也是如此 - 您可以使用任何哈希表实现,只要所有线程都使用相同的实现即可。