在Python中使用mmap

3 投票
3 回答
3169 浏览
提问于 2025-04-16 22:26

有人能解释一下在这种情况下,0是如何影响Python中的mmap的吗:

mmap.mmap(0 , 256, "some tag")

我一直以为我需要传递文件描述符,而不是0,那为什么用0呢?

3 个回答

0

在*nix系统中,文件编号0代表标准输入。所以,如果你的调用是从一个文件中读取标准输入(你不能对终端设备使用mmap),并且这个文件是以读写方式打开的(否则你需要加上access=mmap.ACCESS_READ或者类似的设置)。如果这种情况确实是你想要的行为,我建议你可以用sys.stdin.fileno()来写。

0

你可以查看这个讨论来了解更多信息。

一般来说,如果第一个参数(fileno)是0或者-1,那么你的语句就表示你分配了256字节的内存,这块内存是可以被多个进程共享的,并且不依赖于文件系统中的文件

顺便说一下,我在WinXp上用Python 2.5、2.6、2.7和3.0测试过这段代码,结果都很好。

7

从阅读CPython 2.7的源代码来看,在Windows系统上,指定fileno = 0和指定fileno = -1的效果是一样的,后者表示“映射匿名内存”。

在Unix系统上只接受-1:在我的64位Ubuntu机器上,使用Python 2.6.5时,mmap.mmap(0, 256)会失败,错误信息是errno=19 (没有这样的设备),而mmap.mmap(-1, 256)则可以正常工作。

总结一下:fileno = 0是一个只适用于Windows的变种,不具备跨平台的能力,而fileno = -1则是更通用的选择。这个Windows特有的用法可能会被弃用(代码中甚至有注释警告这一点)。

附注:相关的CPython源文件是Modules/mmapmodule.c

撰写回答