附加現有共享存儲空間的應用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)我想訪問此共享內存
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」
的來源我認爲問題在於unix_key沒有設置,所以attach()中的shmget會失敗。 handle()是私有的,所以我不能調用這個函數來設置unix_key。
是否有可能訪問共享內存而不知道它的大小/調用create()?
當我嘗試調用create()
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);
一個新的共享內存將創建...
我在做什麼錯?提前致謝。
有兩件事我認爲可能會導致問題。一,當你結束時你會分開記憶嗎?二,你是否使用信號量信號來防止同時多次訪問內存?和附件我不知道你可以使用的任何功能,不需要區域的大小。但是,「可能」,你可以嘗試創建另一個區域只有一個整數(或東西)來保持第一個的大小。然後用它來附加它。祝你好運 – koksalb
什麼操作系統?假設你有'ipcs'實用程序,'ipcs -a'的輸出是什麼?這應該顯示您的機器上的所有SysV共享內存段。 –
@koksalb當共享內存成功連接時,我們可以討論分離和信號量。但在這個狀態這沒關係.. – mvollmer