我想在程序中创建许多命名的内存区域,并将mmap
它们放在某个地方,以便其他进程可以读取它们。我不能保证我的程序一次只会运行一个实例。理想情况下,我想将块放在下面/proc/self/<blockname>
等。这可能吗?或者还有其他地方可以放置映射文件吗? (我的程序通常不会以 root 身份运行。)
我不想使用/proc/self/fd
or /proc/self/map_files
,因为这不允许命名它们(据我所知)。
答案1
不,您无法以有意义的方式添加结构,/proc
因为它是生成的(不是“真正的”文件系统)。/sys
在某些机器上也是如此。改变 的结构/proc
并不简单(参见示例在/proc下创建一个文件夹并在该文件夹下创建一个条目)。
进一步阅读:
- Linux 文件系统层次结构:第 1 章。Linux 文件系统层次结构:1.14。 /进程
- mmap、munmap - 将文件或设备映射或取消映射到内存中
- 是否可以在/proc/sys中创建目录和文件?
@mark-plotnick 建议使用 POSIX 共享内存,它确实支持名字。
进一步阅读:
- Posix 共享内存与映射文件(例如,与 mmap 相比)
- shm_overview - POSIX 共享内存概述
- shm_open、shm_unlink - 创建/打开或取消链接 POSIX 共享内存对象
(这些都是命名的物件的操作
shm_open()
类似于open(2)
。 name 指定要创建或打开的共享内存对象。为了便于移植使用,共享内存对象应该由以下形式的名称来标识/somename
;也就是说,最多包含NAME_MAX
(即 255)个字符的以 null 结尾的字符串,其中包含一个初始斜杠,后跟一个或多个字符,但这些字符都不是斜杠。 - shm_open - 打开共享内存对象(实时)(POSIX)
答案2
不。内核决定 中的内容,而不是进程。 (是您要问的问题,而不是:其他进程在 中看不到您的进程。)/proc/PID
/proc/PID
/proc/self
/proc/self
当进程需要传送有关其自身的数据时,放置此信息的常规位置/var/run
对于由管理员启动的进程(即系统服务)来说是在下面,/tmp
对于由用户启动的进程来说是在用户的主目录下。对于与进程相关的信息,主目录通常不是一个好主意,因为它可以在计算机之间共享。现代 Linux 系统也有.选择一个并定义约定,例如目录或其中 1234 是 PID。当进程退出时删除该目录。/run/user/UID
/tmp/myapplication-1234
/run/user/myapplication/1234