Присоедините существующую общую память с помощью QSharedMemory

В приложении 1 (код C) я создаю разделяемую память следующим образом:

char * key_path = "/tmp/shmem";

int file = open(key_path, O_CREAT | O_RDWR | O_APPEND, 0755);
close(file);
key_t key = ftok(key_path, 1);

shmid = shmget (key, SHM_DATASIZE , IPC_CREAT | SHM_R | SHM_W);
shmdata = shmat(shmid, NULL, 0);shmid);

В приложении 2 (QT) я хочу получить доступ к этой SharedMemory

const char* native_key = "/tmp/shmem";

key_t ft_key = ftok(native_key, 1);
key = QString::number(ft_key);

QSharedMemory shmem(key);
if(!shmem.attach()) {
qDebug() << "attach failed" << shmem.errorString()  << shmem.key() << shmem.nativeKey() << endl;
}

Не удалось присоединить «QSharedMemory :: attach (shmget): не существует» «16858191» «/ tmp / qipc_sharedmemory_24384b85e5d54b23bd4f84f14de71b10d4801666»

Итак, я попробовал следующее

const char* native_key = "/tmp/shmem";

key_t ft_key = ftok(native_key, 1);
key = QString::number(ft_key);

QSharedMemory shmem(key);
shmem.setNativeKey(native_key);
if(!shmem.attach()) {
qDebug() << "attach failed" << shmem.errorString()  << shmem.key() << shmem.nativeKey() << endl;
}

ошибка присоединения «QSharedMemory :: attach (shmget): не существует» «» «/ tmp / shmem_prot»

Я взглянул на источник qsharedmemory_unix.cpp

Я думаю, что проблема в том, что unix_key не установлен, так что shmget в attach () потерпит неудачу. handle () является приватным, поэтому я не могу вызвать эту функцию для установки unix_key.

Возможно ли получить доступ к общей памяти, не зная ее размера / вызывая create ()?

Когда я пытаюсь вызвать create ()

QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);

будет создана новая общая память …

Что я делаю неправильно? Заранее спасибо.

0

Решение

Вы не получаете доступ к одному и тому же сегменту общей памяти. Qt изменяет ключ, который вы передаете, и в результате получается другой ключ и, следовательно, идентификатор общей памяти.

Согласно документации QSharedMemory:

Предупреждение: QSharedMemory изменяет ключ специфичным для Qt способом, если не указано иное. Взаимодействие с не-Qt приложениями
достигается сначала созданием разделяемой памяти по умолчанию с
QSharedMemory() а затем установить собственный ключ с setNativeKey(),
При использовании собственных ключей разделяемая память не защищена от
множественный доступ к нему (например, невозможно lock()) и
пользовательский механизм должен быть использован для достижения такой защиты.

Казалось бы, вам нужно создать сегмент общей памяти, используя QSharedMemoryустановить новый ключ, используя setNativeKey()затем прикрепите к этой памяти извне QSharedMemory,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]