Почему моя общая память показывает нули на MacOS?Python

Программы на Python
Ответить
Anonymous
 Почему моя общая память показывает нули на MacOS?

Сообщение Anonymous »

Я пишу интерфейс, позволяющий осуществлять связь между основной программой, написанной на C, и скриптами расширения, написанными на Python и запускаемыми в отдельном процессе интерпретатора Python. Интерфейс использует сокет UNIX для небольших объемов данных и общую память POSIX для больших массивов. Программа C занимается созданием, отслеживанием ресурсов и окончательным отключением общей памяти.
Это прекрасно работает в 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;
А затем данные передаются в Python через сокет.
Функция __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)
(Вызов unregister() существует, потому что SHM всегда выделяется, отслеживается и очищается программой C и передается программе Python, поэтому это подавляет предупреждающие сообщения об утечках shm при выходе из скрипта Python.)
В Linux блок try работает и shm открывается правильно, однако в MacOS я вижу сообщение «Существующий SHM не найден, создается новый один..."
Пожалуйста, может кто-нибудь объяснить, в чем здесь отличие MacOS и как я могу это исправить, чтобы существующий shm открывался правильно?

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-on-macos
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»