如何在 linux 和 osx 中设置 python 和 c++ 之间的共享内存
how to set shared memory between python and c++ in linux and osx
我能够在 windows 上共享内存,只需在 cpp 中使用 winapi 并在 python 中使用 mmap.mmap。只需匹配“名称”。
并且我能够在 mac 上使用 <boost/interprocess/shared_memory_object.hpp>
设置共享内存的名称。
但是 python 的 mmap
.mmap() 没有用。即使在官方文档中,参数也不同。它没有设置名称的参数。
所以我放弃了,决定使用<sys/ipc.h>
。
它能够使用密钥与 python 通信,但是 python 中的 write()
到 sysv_ipc
给出以下错误:
ValueError: Attempt to write past end of memory segment
- python代码
shm = sysv_ipc.SharedMemory(777)
if shm:
offset = 0
for idx in range(0, 21):
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].x), offset)
offset += 4
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].y), offset)
offset += 4
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].z), offset)
offset += 4
- c++代码
shmid = shmget(777, 512, IPC_CREAT | 0666)
shared_memory = shmat(shmid, NULL, 0)
fptr = reinterpret_cast<float *>(shared_memory);
for (int i = 0; i < 63; i += 3)
{
std::cout << fptr[i] << " " << fptr[i + 1] << " " << fptr[i + 2] << "\n";
}
我该怎么办?
问题是 shmget
第二个参数以位为单位,而不是以字节为单位。
所以正确的代码写法是:
shmid = shmget(777, 512 * 8, IPC_CREAT | 0666)
我能够在 windows 上共享内存,只需在 cpp 中使用 winapi 并在 python 中使用 mmap.mmap。只需匹配“名称”。
并且我能够在 mac 上使用 <boost/interprocess/shared_memory_object.hpp>
设置共享内存的名称。
但是 python 的 mmap
.mmap() 没有用。即使在官方文档中,参数也不同。它没有设置名称的参数。
所以我放弃了,决定使用<sys/ipc.h>
。
它能够使用密钥与 python 通信,但是 python 中的 write()
到 sysv_ipc
给出以下错误:
ValueError: Attempt to write past end of memory segment
- python代码
shm = sysv_ipc.SharedMemory(777)
if shm:
offset = 0
for idx in range(0, 21):
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].x), offset)
offset += 4
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].y), offset)
offset += 4
shm.write(struct.pack(
'f', hand_landmarks.landmark[idx].z), offset)
offset += 4
- c++代码
shmid = shmget(777, 512, IPC_CREAT | 0666)
shared_memory = shmat(shmid, NULL, 0)
fptr = reinterpret_cast<float *>(shared_memory);
for (int i = 0; i < 63; i += 3)
{
std::cout << fptr[i] << " " << fptr[i + 1] << " " << fptr[i + 2] << "\n";
}
我该怎么办?
问题是 shmget
第二个参数以位为单位,而不是以字节为单位。
所以正确的代码写法是:
shmid = shmget(777, 512 * 8, IPC_CREAT | 0666)