【问题标题】:how do i change the shm_open path?如何更改 shm_open 路径?
【发布时间】:2012-06-21 14:07:43
【问题描述】:

我目前正在ubunto上开发一个应用程序并调用shm_open,目前默认路径在/var/run/shm内。但是我需要将其更改为 /tmp。简单地尝试以下方法是行不通的:

fd = shm_open("/tmp/test", O_RDWR | O_CREAT, 0777);

谁能给点建议?

【问题讨论】:

  • 查询errno返回的错误码是什么?
  • 如果你的意思是 fd - 它返回 3
  • 好的,这是一个有效的文件描述符……你为什么说它不起作用?
  • 对不起我的错误,当我摆脱 /tmp 时它返回 3。但是执行上述 -1 时返回
  • 这不是共享内存对象的工作方式......在 Linux 上,它们默认创建在 /dev/shm 内部,如果你想要它们在其他地方,你必须挂载一个 tmpfs 文件-所需目录中的系统。

标签: c++ linux boost shared-memory


【解决方案1】:

来自shm_open(3)的手册页:

name 指定要创建或打开的共享内存对象。对于可移植使用,共享内存对象应以/somename 形式的名称标识;也就是说,一个以空字符结尾的字符串,最多由 NAME_MAX(即 255 个)字符组成,由一个初始斜杠组成,后跟一个或多个字符,其中没有一个是斜杠

shm_open(3)name 参数是对象名,不是文件路径!碰巧的是,GLIBC 将所有共享内存对象放在 /dev/shm/var/run/shm 中,方法是在对象名称的路径前加上 open() 在结果名称上调用。如果您将/tmp/test 指定为共享对象名称,那么Linux 将尝试打开或创建/var/run/shm/tmp/test。使用O_CREAT 打开会创建新文件,但不会创建新目录

如果您在调用shm_open("/tmp/test", ...) 之前首先创建目录/var/run/shm/tmp,则您的测试将起作用。请记住在完成共享内存对象后将其删除。另请注意,使用内部带有两个斜杠的对象名称可能无法移植到其他 Unix 系统。

【讨论】:

    【解决方案2】:

    为此,您需要在/tmp 中挂载tmpfs 文件系统:

    mihai@keldon:~$ mount | grep shm
    shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
    

    否则是不可能的。

    【讨论】:

    • 我试过 mount | grep shm 但在 /run/shm 类型 tmpfs (rw,nosuid,nodev) 上没有得到以下结果
    • 我的错,上面只显示了安装在那里的文件系统的类型。您需要使用mount 安装它。
    猜你喜欢
    • 2011-09-10
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2015-03-17
    相关资源
    最近更新 更多