【发布时间】:2017-02-22 11:54:15
【问题描述】:
在应用程序 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);
在 Application 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 未设置,因此 attach() 中的 shmget 将失败。 handle() 是私有的,所以我不能调用这个函数来设置 unix_key。
是否可以在不知道共享内存大小/调用 create() 的情况下访问共享内存?
当我尝试调用 create() 时
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);
将创建一个新的共享内存...
我做错了什么?提前致谢。
【问题讨论】:
-
我认为有两件事可能会导致问题。一,当你结束记忆时,你会分离记忆吗?二、是否使用信号量信号来防止同时多次访问内存?对于附件,我不知道您可以使用不需要区域大小的任何功能。但是“也许”你可以尝试用一个整数(或其他东西)创建另一个区域来保持第一个的大小。然后用它来附加它。祝你好运
-
什么操作系统?假设您有
ipcs实用程序,ipcs -a的输出是什么?这应该会显示您机器上的所有 SysV 共享内存段。 -
@koksalb 我们可以讨论共享内存成功附加时的分离和信号量。但是在这种状态下,这并不重要..
-
@AndrewHenle 我正在使用 Linux Mint。我已经在使用ipcs了。
0x01013c3f 1048586 mvollmer 600 23720 1 0x13013c51 1507340 mvollmer 600 23720 11048586由Application 1创建,1507340由QT创建。
标签: c++ c qt qsharedmemory