В приложении 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);
будет создана новая общая память …
Что я делаю неправильно? Заранее спасибо.
Вы не получаете доступ к одному и тому же сегменту общей памяти. Qt изменяет ключ, который вы передаете, и в результате получается другой ключ и, следовательно, идентификатор общей памяти.
Согласно документации QSharedMemory:
Предупреждение: QSharedMemory изменяет ключ специфичным для Qt способом, если не указано иное. Взаимодействие с не-Qt приложениями
достигается сначала созданием разделяемой памяти по умолчанию с
QSharedMemory()
а затем установить собственный ключ сsetNativeKey()
,
При использовании собственных ключей разделяемая память не защищена от
множественный доступ к нему (например, невозможноlock()
) и
пользовательский механизм должен быть использован для достижения такой защиты.
Казалось бы, вам нужно создать сегмент общей памяти, используя QSharedMemory
установить новый ключ, используя setNativeKey()
затем прикрепите к этой памяти извне QSharedMemory
,
Других решений пока нет …