【问题标题】:Purpose of shm_open() and ftruncate()?shm_open() 和 ftruncate() 的用途?
【发布时间】:2016-07-03 12:29:27
【问题描述】:

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

shm_open() 在还不知道大小的情况下如何首先创建内存区域?如果不是这种情况并且我完全错了,那么请告诉我shm_open()ftruncate(). 的目的提前谢谢!!!

【问题讨论】:

    标签: c linux operating-system


    【解决方案1】:

    shm_open的重点是可以打开一个已有的内存区。但是,如果它不存在并且您要创建它,shm_open 将创建一个 0 字节的新共享内存对象,就像 open O_CREAT 将创建一个 0 字节的文件。来自Linux manuals

    O_CREAT

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

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

    (强调我的)

    由于shm_open 不将新创建区域的大小作为参数(它会使系统调用/库调用复杂化以添加各种情况的参数),ftruncate() 必须用于更改从其初始大小打开的共享内存区域。


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

    【讨论】:

    • 是的。 shm_open遵循shm区域的创建者决定其大小的概念,用户甚至不需要知道我>它。否则,您将需要在双方之间签订某种合同,尺寸应该是多少。
    • "shm_open 在创建文件时表现得像打开":这是否意味着shm_open 在创建文件时与open 没有任何区别,并且可以被它取代了?
    • @ギョーム 没有,并且已修复。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2018-08-27
    • 2016-04-30
    相关资源
    最近更新 更多