当我们创建共享内存时,使用shm_open()
和ftruncate()
函数。据我了解,shm_open()
会创建一个共享内存区域。然后我们使用ftruncate()
函数来配置共享内存区域的大小。
那么当shm_open()
还不知道共享内存区域的大小时,它是如何创建内存区域的呢?如果我的理解不正确,请告诉我shm_open()
和ftruncate()
的目的。谢谢!
当我们创建共享内存时,使用shm_open()
和ftruncate()
函数。据我了解,shm_open()
会创建一个共享内存区域。然后我们使用ftruncate()
函数来配置共享内存区域的大小。
那么当shm_open()
还不知道共享内存区域的大小时,它是如何创建内存区域的呢?如果我的理解不正确,请告诉我shm_open()
和ftruncate()
的目的。谢谢!
shm_open
的主要作用是可以打开一个已经存在的内存区域。但是,如果它不存在并且需要创建该区域,则shm_open
会创建一个0字节大小的新共享内存对象,就像open
与O_CREAT
一样会创建一个0字节大小的文件。引用自Linux手册:
O_CREAT
如果不存在,则创建共享内存对象。对象的用户和组所有权来自调用进程的相应有效ID,并根据mode的低9位设置对象的权限位,除了在进程文件模式创建掩码中设置这些位的新对象将被清除。可以用一组宏常量来定义mode,在open(2)中列出了这些常量的符号定义。(这些常量的符号定义可以通过包含获取。)
新的共享内存对象最初长度为零 -- 可以使用
ftruncate(2)
设置对象的大小。新分配的共享内存对象的字节会自动初始化为0。
(本人加粗部分)
由于shm_open
没有将新创建区域的大小作为参数(这会使系统调用/库调用变得复杂,需要添加各种情况的参数),因此必须使用ftruncate()
来更改打开的共享内存区域的大小。
当然,对于已经在其他地方正确创建和调整大小的共享内存段,您不必使用ftruncate
。如果您想知道其大小,请使用fstat
。还可以参见shm_overview(7)
。
shm_open
与open
没有任何区别,可以互相替换? - kotchwane