C linux中的匿名内存映射映射到哪个文件?

C linux中的匿名内存映射映射到哪个文件?,c,linux,ipc,mmap,C,Linux,Ipc,Mmap,我的问题是,当我们创建匿名内存映射时,映射到进程地址空间的文件是什么。我知道匿名映射保证用零填充。然后是/dev/zero文件吗?据我所知,进程间通信是不可能的,直到有一些文件被映射到参与进程的地址空间中。。。无论是tmpfs中的文件还是普通文件系统中的文件。我不熟悉进程间通信,如果您发现我的理解有任何缺陷,请纠正。来自man mmap: MAP\u匿名 映射没有任何文件支持;[……] 它只是分配和初始化内存。在调用mmap之前,由于虚拟内存未映射到实际内存,因此尝试访问内存时会遇到保护冲突(S

我的问题是,当我们创建匿名内存映射时,映射到进程地址空间的文件是什么。我知道匿名映射保证用零填充。然后是/dev/zero文件吗?据我所知,进程间通信是不可能的,直到有一些文件被映射到参与进程的地址空间中。。。无论是tmpfs中的文件还是普通文件系统中的文件。我不熟悉进程间通信,如果您发现我的理解有任何缺陷,请纠正。

来自
man mmap

MAP\u匿名

映射没有任何文件支持;[……]


它只是分配和初始化内存。在调用
mmap
之前,由于虚拟内存未映射到实际内存,因此尝试访问内存时会遇到保护冲突(SIGSEGV)。(好吧,这就是在具有虚拟内存的系统中发生的情况。)

来自
manmmap

MAP\u匿名

映射没有任何文件支持;[……]

它只是分配和初始化内存。在调用
mmap
之前,由于虚拟内存未映射到实际内存,因此尝试访问内存时会遇到保护冲突(SIGSEGV)。(好吧,这就是在具有虚拟内存的系统中发生的情况。)

我的问题是,当我们创建匿名内存映射时,映射到进程地址空间的文件是什么

没有文件

我知道匿名映射保证用零填充。然后是/dev/zero文件吗

没有

然而,从历史上看,
MAP\u ANONYMOUS
标志是比
mmap
本身更新的发明。在此之前,如果您想要一块充满零且没有任何常规文件支持的内存,那么您确实需要打开
/dev/zero
并对其进行mmap。这是操作系统处理的一个特例,可以有效地为您提供匿名映射;创建
/dev/zero
映射的不同进程不会看到彼此的数据,即使它们使用
MAP\u SHARED
。我相信
MAP\u ANONYMOUS
标志的引入是为了简化这个过程,避免额外的系统调用来打开和关闭
/dev/zero

据我所知,进程间通信是不可能的,直到有一些文件被映射到参与进程的地址空间中。。。无论是tmpfs中的文件还是普通文件系统中的文件

嗯,那不是真的
MAP_ANONYMOUS | MAP_SHARED
就是一个反例。如果您的进程使用
MAP\u ANONYMOUS | MAP\u SHARED
创建映射,则在该点之后使用
fork()
创建的所有子级(及其子级等)将继承映射,并且内存将在所有子级和父级之间共享。所有进程都将看到这些进程对该内存的任何写入

这意味着您只能将其用于“相关”进程之间的IPC,即创建映射的共同祖先的后代(除非我不知道有什么聪明的技巧可以访问不相关的进程)。映射实际文件(除
/dev/zero
)没有此限制

当然还有其他IPC机制根本不涉及文件,例如POSIX共享内存(
shmget
和friends)

我的问题是,当我们创建匿名内存映射时,映射到进程地址空间的文件是什么

没有文件

我知道匿名映射保证用零填充。然后是/dev/zero文件吗

没有

然而,从历史上看,
MAP\u ANONYMOUS
标志是比
mmap
本身更新的发明。在此之前,如果您想要一块充满零且没有任何常规文件支持的内存,那么您确实需要打开
/dev/zero
并对其进行mmap。这是操作系统处理的一个特例,可以有效地为您提供匿名映射;创建
/dev/zero
映射的不同进程不会看到彼此的数据,即使它们使用
MAP\u SHARED
。我相信
MAP\u ANONYMOUS
标志的引入是为了简化这个过程,避免额外的系统调用来打开和关闭
/dev/zero

据我所知,进程间通信是不可能的,直到有一些文件被映射到参与进程的地址空间中。。。无论是tmpfs中的文件还是普通文件系统中的文件

嗯,那不是真的
MAP_ANONYMOUS | MAP_SHARED
就是一个反例。如果您的进程使用
MAP\u ANONYMOUS | MAP\u SHARED
创建映射,则在该点之后使用
fork()
创建的所有子级(及其子级等)将继承映射,并且内存将在所有子级和父级之间共享。所有进程都将看到这些进程对该内存的任何写入

这意味着您只能将其用于“相关”进程之间的IPC,即创建映射的共同祖先的后代(除非我不知道有什么聪明的技巧可以访问不相关的进程)。映射实际文件(除
/dev/zero
)没有此限制


当然还有其他IPC机制根本不涉及文件,例如POSIX共享内存(
shmget
和friends)。

您不能写入/dev/zero。匿名mmap没有文件支持。@斯塔克令人惊讶的是,
mmap
ing
/dev/zero
确实生成了一个有用的映射,它的工作原理与匿名映射一样。@斯塔克:嗯,它必须映射到正确的东西。否则,如何在父级和