2010-08-19 75 views
2

我正在使用的操作系统(IBM CNK,它不是Linux,但符合POSIX标准)不允许我使用fopen在/ dev/shm中简单创建新文件或目录()或mkdir()。看起来我必须使用shm_open()来获取文件描述符,然后使用fdopen()将共享区域用于文件I/O。POSIX共享内存+目录

  • 我是否需要使用ftruncate()设置共享区域的大小,还是自动增长?我已经尝试过了,我可以简单地将fprintf放入该区域,并且它可以正常工作,但是安全吗? 该手册页只是说:

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

  • 难道我要mmap()的区域?我只是想在内存中拥有一个包含文件的目录。

  • 我该如何在/ dev/shm中创建一个新目录?这是“与/ dev/shm一起工作,就像它是一个正常的文件系统”一样吗?/dev/shm中的目录可能不是标准的?

+0

>最近2.6 Linux内核版本已经开始以RAM磁盘的形式提供/ dev/shm作为共享内存,更具体地说是作为一个世界可写的[澄清需要]目录,存储在内存中,具有定义的限制在/ etc /默认/ TMPFS。/dev/shm支持在内核配置文件中是完全可选的。它在Fedora和Ubuntu发行版中默认包含。 Aha ... – nisc 2010-08-19 11:02:18

+0

y:他写道他不使用Linux ... – DarkDust 2010-08-19 11:09:46

+5

OP和niscy是同一个人:P – nisc 2010-08-19 11:16:53

回答

0

您的操作系统是否提供全功能mmap?您是否只需要亲属中的共享内存区域,即您处理的内存区域?如果这两个条件都满足你并不需要在所有的任何文件,只是使用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. 
} 
1

我从来没有听说过IBM CNK的面前......但让我们做一些概括从POSIX/SUS。

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

/dev/shm的存在纯粹是shm_open的实施细节。如果没有/dev/shm并且以其他方式实现shm_open,则符合POSIX标准。在Linux上,/dev/shm碰巧是一个正常的(尽管是内存支持的)文件系统,但是你不能期望/dev/shm能够像文件系统一样行动,甚至是存在。

+1

FYI:CNK =计算节点内核。在BlueGene/P后端节点上运行。 – nisc 2011-03-28 12:31:03