Это прекрасно работает в Linux. Я могу передавать данные между двумя процессами, как и ожидалось, с помощью shm.
Однако, когда точно такой же код выполняется в MacOS, хотя он и работает без ошибок, общая память при чтении всегда полна нулей. от другого процесса к тому, который заполнил память. например если я записываю данные изображения в shm из C и читаю их из Python, все это равно нулю. Если я записываю данные изображения в shm из Python и читаю их из C, снова все равно нулю.
Я создаю shm в C следующим образом: (некоторые строки обработки ошибок удалены для ясности)
Код: Выделить всё
void *shm_ptr = NULL;
snprintf(shm_name_ptr, 30, "/%08x%08x%08x%04x", my_random_int(), my_random_int(), my_random_int(), my_random_int());
debug_print("shm name: %s\n", shm_name_ptr);
*fd = shm_open(shm_name_ptr, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
ftruncate(*fd, aligned_size) == -1);
shm_ptr = mmap(NULL, (size_t) aligned_size, PROT_READ | PROT_WRITE,
MAP_SHARED, *fd, 0);
*shm_ptr_ptr = shm_ptr;
Код: Выделить всё
shm name: /b6c31655f708d0e20760b60bc483
SHM allocation: Original size: 25941632, Aligned size: 25944064, Page size: 4096
Truncating shm file to 25941632 bytes
log: b'/b6c31655f708d0e20760b60bc483'
Функция __init__ из Класс-оболочка, который я использую в Python для открытия shm, показан ниже:
Код: Выделить всё
class SharedMemoryWrapper:
"""
Wrapper class to handle shared memory creation and cleanup across platforms.
"""
def __init__(self, name: str, size: int):
self.name = name
self.size = size # Store intended size separately
self._shm = None
try:
# First try to attach to existing shared memory
self._shm = shared_memory.SharedMemory(name=self.name)
unregister(self._shm._name, "shared_memory")
except FileNotFoundError:
# If it doesn't exist, create new shared memory
print("Existing SHM not found, creating a new one...")
self._shm = shared_memory.SharedMemory(name=self.name, create=True, size=self.size)
Как только имя и размер получены через сокет, объект общей памяти инициализируется с использованием SharedMemoryWrapper(name=name_from_socket, size=size_from_socket)
В Linux блок try работает и shm открывается правильно, однако в MacOS я вижу сообщение «Существующий SHM не найден, создаю новый. .."
Пожалуйста, может кто-нибудь объяснить, чем здесь отличается MacOS, и как я могу это исправить, чтобы существующий shm открывался правильно?
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-on-macos
Мобильная версия