Python 调用系统DLL(2) 共享内存
理论上来说调用系统DLL不区分语言,所以可以在不同语言中使用共享内存进行数据传输。
共享内存简介
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃。(来源百度百科)
测试代码
test1.py
import msvcrt, mmap
from ctypes import *
INFINITE = 0xFFFFFFFF
SEMAPHORE_ALL_ACCESS = 0x001f0003
FILE_MAP_ALL_ACCESS = 0xF001F
INVALID_HANDLE_VALUE = 0xFFFFFFFF
SHMEMSIZE = 0x8999999
FALSE = 0
PAGE_READWRITE = 0x04
szName = c_char_p("ShareMemory".encode())
szMsg = "test1 save!".encode()
hMapObject = windll.kernel32.CreateFileMappingA(INFINITE,None, PAGE_READWRITE, 0, SHMEMSIZE, szName)
if (hMapObject == 0):
print ("Could not open file mapping object")
raise WinError()
cBuf = windll.kernel32.MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 1024)
memcpy = cdll.msvcrt.memcpy
memcpy(cBuf, szMsg, len(szMsg))
msvcrt.getch()
windll.kernel32.UnmapViewOfFile(cBuf)
windll.kernel32.CloseHandle(hMapObject)
test2.py
from ctypes import *
INFINITE = 0xFFFFFFFF
SEMAPHORE_ALL_ACCESS =