这似乎应该有效.我确实在mmapmodule.c源代码#ifdef MS_WINDOWS中找到了一个可疑位.具体来说,在完成解析参数的所有设置之后,代码会执行以下操作:
if (fileno != -1 && fileno != 0) {
/* Ensure that fileno is within the CRT's valid range */
if (_PyVerify_fd(fileno) == 0) {
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
fh = (HANDLE)_get_osfhandle(fileno);
if (fh==(HANDLE)-1) {
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
/* Win9x appears to need us seeked to zero */
lseek(fileno, 0, SEEK_SET);
}
它将您的基础文件对象的偏移量从“文件结束”移动到“文件开头”,然后将其保留在那里.这似乎不应该破坏任何东西,但是在调用mmap.mmap映射文件之前,可能值得自己寻找文件的开始.
(下面的所有内容都是错误的,但是因为有评论而留下来.)
通常,在使用mmap()之后,必须使用munmap()来撤消映射.简单地关闭文件描述符无效. Linux documentation明确地称之为:
munmap()
The munmap() system call deletes the mappings for the specified address range, and causes further references to addresses within the range to generate invalid memory references. The region is also automatically unmapped when the process is terminated. On the other hand, closing the file descriptor does not unmap the region.
(BSD文档类似.Windows在这里可能与类Unix系统的行为不同,但你所看到的表明它们的工作方式相同.)
不幸的是,Python的mmap模块不绑定munmap系统调用(也不是mprotect),至少从2.7.11和3.4.4开始.作为解决方法,您可以使用ctypes模块.有关示例,请参阅this question(它调用reboot,但相同的技术适用于所有C库函数).或者,对于更好的方法,您可以在cython中编写包装器.