我可以通过CreateNamedPipe
在Windows中创建一个命名的管道。
p = win32pipe.CreateNamedPipe(r'\.pipetest_pipe',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None)
这是一个类似文件的对象,与Linux FIFOS相反,它不存在于主文件系统中,而是在特殊的内核名称空间中(这就是\.pipe
的目的(。现在,我有一个居住在//./xillybus_read_32
的设备,并想嘲笑它进行测试,即创建一种表现上的假货。根据MSDN的说法,这是Win32设备名称空间。如果可能,如何在那里创建一个类似管道的对象?编写驱动程序是必要的,还是有用户空间API?
(当然,我可以更改使用管道的消耗代码,或以其他十几种方式解决。但是我真的很好奇这个Win32设备名称空间。(
我想我找到了它。此评论,哈里·约翰斯顿(Harry Johnston(的评论以及一些通过winobj浏览的评论使我进入了解决方案。
import win32pipe, win32file, win32con
win32file.DefineDosDevice(win32con.DDD_RAW_TARGET_PATH, r'test_device', r'??GLOBALpipetest_pipe')
fileHandle = win32file.CreateFile(r"//./test_device",
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0, None,
win32file.OPEN_EXISTING,
0, None)
data = win32file.ReadFile(fileHandle, 4096)
print (data)
这里发生的是??
将您留在Sessions DosDevices[LogonID]
中。在该文件夹中,有一个符号链接GLOBAL
导致GLOBAL??
,其中命名管为实时。
为什么我无法通过\.GLOBAL??pipetest_pipe
直接访问路径,为什么CreateFile和CreateNamedPipe可以在\.pipetest_pipe
下找到它,我还不知道。我也不确定之后是否应该进行一些清理。尽管如此,这似乎有效。