我目前正在Ubuntu上开发一个应用程序,并调用shm_open函数。默认路径在/var/run/shm下,但我需要将其更改为/tmp。尝试以下方法无效:
fd = shm_open("/tmp/test", O_RDWR | O_CREAT, 0777);
请问有什么建议吗?
我目前正在Ubuntu上开发一个应用程序,并调用shm_open函数。默认路径在/var/run/shm下,但我需要将其更改为/tmp。尝试以下方法无效:
fd = shm_open("/tmp/test", O_RDWR | O_CREAT, 0777);
请问有什么建议吗?
根据shm_open(3)
的手册页面:
name
参数用于创建或打开一个指定的共享内存对象。为了便于移植,共享内存对象应该使用形如/somename
的名称标识;也就是说,一个由斜杠开始、后面跟着一个或多个字符的、不超过NAME_MAX
(即255)个字符的空结束字符串,该字符串中不能包含斜杠。
shm_open(3)
函数的name
参数是一个对象名,而非文件路径!只是碰巧GLIBC通过在对象名前添加路径并调用open()
函数,将所有共享内存对象放置在/dev/shm
或/var/run/shm
下。如果你将/tmp/test
作为共享对象名,Linux会尝试打开或创建/var/run/shm/tmp/test
。通过带有O_CREAT
标志的open()
可以创建新文件,但无法创建新目录。
如果您在调用shm_open("/tmp/test", ...)
之前先创建目录/var/run/shm/tmp
,那么您的测试将会成功。请记得在使用共享内存对象后删除该目录。同时请注意,使用两个斜杠的对象名可能在其他Unix系统上无法移植。
/dev/shm
? - DDStmpfs
挂载点,通常挂载在/dev/shm
或/var/run/shm
下面。 - Hristo Iliev/tmp
目录下挂载一个tmpfs
文件系统来完成此操作:mihai@keldon:~$ mount | grep shm
shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
mount
命令进行挂载。 - Mihai Maruseac
shm_open
返回-1
后调用perror(NULL);
会发生什么? - Jason/dev/shm/tmp/
这样的目录...因此,您无法创建名为/dev/shm/tmp/test
的文件,因为不存在tmp
目录。如果必须使用/tmp
,则@Mihai的答案是正确的,否则您可以简单地使用test
,这将创建/dev/shm/test
。 - Jason/dev/shm
中创建的,如果您想将它们放在其他地方,您必须在所需目录中挂载一个tmpfs
文件系统。 - Jason