当我们创建共享内存时,我们使用shm_open()
和ftruncate()
函数。根据我的信息shm_open()
创建一个共享内存区域。然后我们使用ftruncate()
函数来配置共享内存区域的大小。
当shm_open()
还不知道大小时,{1}}如何首先创建内存区域?如果情况并非如此,我完全错了,那么请告诉我shm_open()
和ftruncate().
提前致谢的目的!
答案 0 :(得分:10)
shm_open
的要点是您可以打开现有内存区域。但是,如果它不存在且您创建,则shm_open
在创建文件时的行为与open
相似; 新创建的内存区域的大小为0.来自arbitrary instance:
O_CREAT
如果共享内存对象不存在,则创建它。对象的用户和组所有权取自调用进程的相应有效ID,对象的权限位根据模式的低9位设置,除了在进程文件模式创建掩码中设置的那些位(见umask(2))被清除为新对象。 open(2)中列出了一组可用于定义模式的宏常量。 (这些常数的符号定义可以通过包含来获得。)
新的共享内存对象最初的长度为零 - 可以使用
ftruncate(2).
设置对象的大小。共享内存对象的新分配字节会自动初始化为0。
(强调我的)
由于shm_open
没有将新创建的区域的大小作为参数(它使系统调用/库调用复杂化为各种情况添加参数),ftruncate()
必须使用将打开的共享内存区域的大小从其初始大小更改。
当然,您不必将ftruncate
用于已正确创建并在其他位置调整大小的共享内存段。如果您想知道它的大小,请使用fstat
。另请参阅Linux manuals