我正在开发的操作系统(IBM CNK,不是Linux,但有些POSIX兼容)不允许我使用fopen()或mkdir在/ dev / shm中创建新文件或目录( ), 分别。看起来我必须使用shm_open()来获取文件描述符,然后使用fdopen()将共享区域用于文件I / O.
我是否需要使用ftruncate()设置共享区域的大小,还是自动增长?我已经尝试了,我可以简单地进入该区域并且它可以工作,但它是否安全? 该联机帮助页只说:
新的共享内存对象最初的长度为零 - 可以使用ftruncate(2)设置对象的大小。新的 分配的共享内存对象的字节是自动的 初始化为0。
我想mmap()该地区吗?我只想在内存中有一个包含文件的目录。
如何在/ dev / shm中创建新目录?这是“与/ dev / shm一起工作,好像它是一个普通的文件系统”一个新东西? / dev / shm中的目录可能不是标准的吗?
答案 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.
}