我有以下代码工作得很好:
server.py
from mmap import mmap
from pickle import load, dump
mm = mmap(-1, 32, tagname='test')
last_request_id = None
while True:
mm.seek(0)
try:
request_id = int(load(mm))
if request_id != last_request_id:
last_request_id = request_id
print(request_id)
except Exception:
pass
client.py
from mmap import mmap
from pickle import dump
with mmap(-1, 32, tagname='test') as mm:
request_id = 1
dump(request_id, mm)
因此,每次服务器收到新的请求id时,服务器都会在控制台上打印id。但是现在我想使用全局范围。因此,我将(客户机和服务器)上的标签名更改为r'Global\test'
。更改后,当服务器或客户端启动时,它将显示一个权限错误:
PermissionError: [WinError 5] Access is denied
因此,我读到了这只燕窝,它是一种安全机制,可以防止任何人创建全局内存映射文件,并且管理员、IIS用户或服务默认拥有创建全局内存映射文件的权限。由于知道我创建了一个运行服务器的Windows服务,并且它不会出现任何错误,所以服务器能够创建全局mmap。但是问题仍然存在于客户端(权限错误)。
读取Microsoft文档,它说“特权检查仅限于创建文件映射对象”.“在任何会话中运行的任何进程都可以访问该文件映射对象,只要用户具有必要的访问权限”。我想知道我需要做些什么来读取服务器在我的客户端应用程序上创建的全局mmap。
发布于 2022-11-29 09:29:17
您需要在客户端调用OpenFileMapping()
。但是当前Python模块调用mmap
来打开一个现有的文件映射对象(您可以在这上看到这一点)。
所以你不能用纯Python做你想做的事。我建议使用multiprocessing
模块提供的其他IPC机制。( multiprocessing.shared_memory.SharedMemory
不会有帮助,因为它在后端调用了mmap
API。)
作为附带说明,我建议您在这里上编写一份问题报告。
https://stackoverflow.com/questions/74607900
复制相似问题