В Application 1 (C-код) им создать общую память, как это:Присоединить существующий общий объем памяти с QSharedMemory
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 :: присоединять (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 :: присоединять (shmget): не существует" "" "/ TMP/shmem_prot"
Я взглянул на источник qsharedmemory_unix.cpp
Я думаю, проблема заключается в том, что unix_key не установлен, поэтому shmget в attach() завершится с ошибкой. handle() является закрытым, поэтому я не могу вызвать эту функцию, чтобы установить unix_key.
Возможно ли получить доступ к общей памяти, не зная ее размера/вызова create()?
Когда я пытаюсь вызвать создать()
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);
будет создана новая общая память ...
Что я делаю неправильно? Заранее спасибо.
Есть 2 вещи, которые, я думаю, могут вызвать проблемы. Во-первых, вы отделите память, когда закончите с ней? два, вы используете сигналы семафора для одновременного предотвращения множественного доступа к памяти? и для прикрепления я не знаю никакой функции, которую вы можете использовать, которая не требует размера области.Но «возможно» вы можете попытаться создать другую область с одним целым числом (или чем-то), чтобы удержать размер первого. И используйте его, чтобы прикрепить его впоследствии. удачи – koksalb
Какая ОС? Предполагая, что у вас есть утилита 'ipcs', каков вывод из' ipcs -a'? Это должно показать все сегменты разделяемой памяти SysV на вашем компьютере. –
@koksalb Мы можем поговорить об отсоединении и семафорах, когда общая память была успешно присоединена. Но в этом состоянии это не имеет значения. – mvollmer