在Python中使用mmap
有人能解释一下在这种情况下,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
。