在我的程序中,我生成一些文件,将其写入磁盘,然后将其提供给第二个程序,该程序再次在我的父应用程序中从磁盘读取它。我在第二个程序完成执行后立即删除这些文件。
我想知道是否有类似“反向 mmap”的东西可以使另一个程序通过文件系统访问地址空间。 然后我可以将我的地址空间“映射”到文件系统,程序 B 可以从那里读取它,将其视为常规文件。
有什么指点吗?
使另一个程序可以通过文件系统访问地址空间
虽然技术上有一种方法可以通过
/proc
来做到这一点,但这是一个糟糕的主意,所以我不会详细介绍。
您可以做的是使用
shm_open
创建(并映射和写入)一个 POSIX 命名的共享内存对象,然后可以在另一个进程中类似地打开(并映射和读取)该对象。路径名必须以 /
开头才能像这样可移植共享。
这个共享内存对象从技术上讲并不是一个文件:尽管至少在 Linux 上它由
tmpfs
文件支持,但它不会被写入任何磁盘,除非可能是由于分页。
这确实要求子进程知道它被赋予了共享内存段名称,除非您只是传递
tmpfs
路径名(例如,Linux上的/dev/shm/pathname
)。
System V 共享内存正是您所寻找的。请参阅
shmat
、shmdt
、shmget
和相关系统调用。但请注意,就像 mmap
'ing 文件一样,这不提供简单的 read()
/write()
界面。它的性能可能更高,但也复杂得多。我已经多次使用 SysV 共享内存。它需要互斥锁,要么嵌入在共享内存中,要么嵌入在 SysV 等效项中(请参阅 semget
和 semop
系统调用)。