我目前正在ubunto上开发一个应用程序并调用shm_open,目前默认路径在/var/run/shm内。但是我需要将其更改为 /tmp。简单地尝试以下方法不起作用:
fd = shm_open("/tmp/test", O_RDWR | O_CREAT, 0777);
谁能给点建议?
我目前正在ubunto上开发一个应用程序并调用shm_open,目前默认路径在/var/run/shm内。但是我需要将其更改为 /tmp。简单地尝试以下方法不起作用:
fd = shm_open("/tmp/test", O_RDWR | O_CREAT, 0777);
谁能给点建议?
从手册页shm_open(3)
:
name
指定要创建或打开的共享内存对象。对于可移植使用,共享内存对象应该由一个形式的名称来标识/somename
;也就是说,一个以空字符结尾的字符串,最多NAME_MAX
包含(即 255 个)字符,由一个初始斜杠组成,后跟一个或多个字符,其中没有一个是斜杠。
的name
参数shm_open(3)
是对象名,不是文件路径!碰巧 GLIBC 将所有共享内存对象放在对象名称的路径中/dev/shm
或/var/run/shm
通过在路径前面加上对象名称并调用open()
结果名称。如果您指定/tmp/test
为共享对象名称,那么 Linux 将尝试打开或创建/var/run/shm/tmp/test
. 打开方式O_CREAT
创建新文件但不创建新目录。
如果您/var/run/shm/tmp
在调用shm_open("/tmp/test", ...)
. 请记住在完成共享内存对象后将其删除。另请注意,使用内部带有两个斜杠的对象名称可能无法移植到其他 Unix 系统。
为此,您需要安装一个tmpfs
文件系统/tmp
:
mihai@keldon:~$ mount | grep shm
shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
否则,这是不可能的。