POSIX共享内存+目录

时间:2010-08-19 10:38:44

标签: c posix shared-memory

我正在开发的操作系统(IBM CNK,不是Linux,但有些POSIX兼容)不允许我使用fopen()或mkdir在/ dev / shm中创建新文件或目录( ), 分别。看起来我必须使用shm_open()来获取文件描述符,然后使用fdopen()将共享区域用于文件I / O.

  • 我是否需要使用ftruncate()设置共享区域的大小,还是自动增长?我已经尝试了,我可以简单地进入该区域并且它可以工作,但它是否安全? 该联机帮助页只说:

      

    新的共享内存对象最初的长度为零 -                    可以使用ftruncate(2)设置对象的大小。新的                   分配的共享内存对象的字节是自动的                 初始化为0。

  • 我想mmap()该地区吗?我只想在内存中有一个包含文件的目录。

  • 如何在/ dev / shm中创建新目录?这是“与/ dev / shm一起工作,好像它是一个普通的文件系统”一个新东西? / dev / shm中的目录可能不是标准的吗?

2 个答案:

答案 0 :(得分:1)

我以前从未听说过IBM CNK ......但是让我们从POSIX / SUS做一些概括。

超出文件末尾的mmap不可移植。在映射之前,您应该调用ftruncate来设置文件的结尾。

/dev/shm的存在纯粹是shm_open的实施细节。没有/dev/shm并且以其他方式实现shm_open将符合POSIX标准。在Linux上,/dev/shm恰好是一个正常的(虽然是内存支持的)文件系统,但你不能轻易地期望/dev/shm能够像文件系统一样行动,甚至存在。

答案 1 :(得分:0)

您的操作系统是否提供功能齐全的mmap?您是否只需要亲戚的共享内存区域,即您fork关闭的进程?如果满足这两个条件,则根本不需要任何文件,只需使用mmap:

char *shm_area;
shm_area = mmap(NULL, mySHMsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0);

if (fork() == 0) {
  // Child, can access shm_area.
} else {
  // Parent, can access shm_area.
}