我正在嘗試使用共享記憶體將 C 程式連接到 python,但我不知道如何將記憶體段的名稱傳遞給 python。
這是我的 C 代碼:
key_t key = ftok("address", 1);
int shm_o;
char* msg = "hello there";
int len = strlen(msg) 1;
void* addr;
shm_o = shmget(key, 20, IPC_CREAT | 0600);
if(shm_o == -1)
{
std::cout << "Failed: shmget.\n";
return 1;
}
addr = shmat(shm_o, NULL, 0);
if(addr == (void*) -1)
{
std::cout << "Failed: shmat.\n";
return 1;
}
std::cout << "Shared memory segment created successfully with id: " << shm_o;
memcpy(addr, msg, len);
getchar();
return 0;
我試圖讓 python 從共享記憶體段中讀取,如下所示:
shm_a = shared_memory.SharedMemory(name="address", create=False, size=20)
print(bytes(shm_a.buf[:11]))
但它會拋出一個例外,說沒有名為“地址”的檔案或目錄。
我是否正確地解決了這個問題,還是有另一種方法可以將 python 附加到共享記憶體段?
任何幫助將非常感激。
uj5u.com熱心網友回復:
冒昧地在這里為 POSIX 共享記憶體段發布一個作業示例,該示例將在 Linux/UNIX 類系統上跨 C/C 和 Python 作業。這在 Windows 上不起作用。
用于創建資料并將資料寫入共享記憶體段的 C 代碼(命令列中提供的名稱):
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <string>
int main(int argc, char * argv[])
{
if (argc != 2) {
std::cerr << "Argument <shmem_name> required" << std::endl;
return 1;
}
const char * shmem_name = argv[1];
size_t shm_size = 4096;
int shmem_fd = shm_open(shmem_name, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
if (shmem_fd == -1) {
perror("shm_open");
return 1;
}
std::cout << "Shared Memory segment created with fd " << shmem_fd << std::endl;
if (ftruncate(shmem_fd, shm_size) == -1) {
perror("ftruncate");
return 1;
}
std::cout << "Shared Memory segment resized to " << shm_size << std::endl;
void * addr = mmap(0, shm_size, PROT_WRITE, MAP_SHARED, shmem_fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return 1;
}
std::cout << "Please enter some text to write to shared memory segment\n";
std::string text;
std::getline(std::cin, text);
while (! text.empty()) {
strncpy((char *)addr, text.data(), shm_size);
std::cout << "Written '" << text << "' to shared memory segment\n";
std::getline(std::cin, text);
}
std::cout << "Unlinking shared memory segment." << std::endl;
shm_unlink(shmem_name) ;
}
從共享記憶體段的開頭讀取任何字串的 Python 代碼:
import sys
from multiprocessing import shared_memory, resource_tracker
if len(sys.argv) != 2:
print("Argument <shmem_name> required")
sys.exit(1)
shm_seg = shared_memory.SharedMemory(name=sys.argv[1])
print(bytes(shm_seg.buf).strip(b'\x00').decode('ascii'))
shm_seg.close()
# Manually remove segment from resource_tracker, otherwise shmem segment
# will be unlinked upon program exit
resource_tracker.unregister(shm_seg._name, "shared_memory")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508355.html
上一篇:為什么浮點下溢發生在2?12??
下一篇:如何重新打開winapi視窗?
