shm_open()和ftruncate()的目的是什么?

15

当我们创建共享内存时,使用shm_open()ftruncate()函数。据我了解,shm_open()会创建一个共享内存区域。然后我们使用ftruncate()函数来配置共享内存区域的大小。

那么当shm_open()还不知道共享内存区域的大小时,它是如何创建内存区域的呢?如果我的理解不正确,请告诉我shm_open()ftruncate()的目的。谢谢!

1个回答

18
shm_open 的主要作用是可以打开一个已经存在的内存区域。但是,如果它不存在并且需要创建该区域,则shm_open会创建一个0字节大小的新共享内存对象,就像openO_CREAT一样会创建一个0字节大小的文件。引用自Linux手册

O_CREAT

如果不存在,则创建共享内存对象。对象的用户和组所有权来自调用进程的相应有效ID,并根据mode的低9位设置对象的权限位,除了在进程文件模式创建掩码中设置这些位的新对象将被清除。可以用一组宏常量来定义mode,在open(2)中列出了这些常量的符号定义。(这些常量的符号定义可以通过包含获取。)

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

(本人加粗部分)

由于shm_open没有将新创建区域的大小作为参数(这会使系统调用/库调用变得复杂,需要添加各种情况的参数),因此必须使用ftruncate()来更改打开的共享内存区域的大小。


当然,对于已经在其他地方正确创建和调整大小的共享内存段,您不必使用ftruncate。如果您想知道其大小,请使用fstat。还可以参见shm_overview(7)


没错。shm_open 遵循的概念是,shm 区域的创建者确定其大小,用户甚至不需要知道它。否则,你需要在各方之间有某种协议来确定大小。 - tofro
“shm_open在创建文件时的行为类似于open”:这是否意味着在创建文件时shm_openopen没有任何区别,可以互相替换? - kotchwane
@ギョーム 不,已经修复了。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接