2017-02-22 3 views
0

기존의 공유 메모리를 첨부 1 (C 코드) 메신저과 같은 공유 메모리를 생성 :이 SharedMemory응용 프로그램에서 QSharedMemory

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; 
} 
에게 액세스하려는 응용 프로그램 2 (QT)에서
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); 

"16858191" "/ tmp를/qipc_sharedmemory_24384b85e5d54b23bd4f84f14de71b10d4801666"

,691,363 :

은 "존재하지 않는 QSharedMemory는 :: (하는 shmget)를 연결"실패 첨부 할 (210)

그래서 내가 해봤 다음

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가 설정되어 있지 않으므로 attach()의 shmget이 실패 할 것이라고 생각합니다. handle()은 private이므로이 함수를 호출하여 unix_key를 설정할 수 없습니다.

크기를 모르는 상태에서 공유 메모리에 액세스 할 수 있습니까/create()를 호출할까요?

내가 만들 호출 할()

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

새로운 공유 메모리가 만든 것입니다 ...

내가 무슨 일을하고 있는가? 미리 감사드립니다.

+0

문제가 발생할 수 있다고 생각되는 2 가지가 있습니다. 하나, 당신이 그것으로 끝났을 때 당신은 메모리를 분리합니까? 둘째, 동시에 메모리에 대한 다중 액세스를 방지하기 위해 세마포어 신호를 사용합니까? 그리고 부착을 위해 당신이 그 영역의 크기를 필요로하는 것을 사용할 수있는 어떤 기능을 알지 못합니다.그러나 "어쩌면"첫 번째 크기를 유지하기 위해 정수 (또는 무언가) 하나만있는 다른 영역을 만들려고 할 수 있습니다. 나중에 부착 할 때 사용하십시오. 행운을 빌어 요 – koksalb

+0

어떤 OS입니까? 'ipcs' 유틸리티를 가지고 있다고 가정하면,'ipcs -a'의 결과는 무엇입니까? 그러면 시스템의 모든 SysV 공유 메모리 세그먼트가 표시됩니다. –

+0

@koksalb 공유 메모리가 성공적으로 연결되었을 때 분리 및 세마포어에 대해 이야기 할 수 있습니다. 하지만이 상태에서는 문제가되지 않습니다 .. – mvollmer

답변

1

동일한 공유 메모리 세그먼트에 액세스하지 않습니다. Qt가 전달한 키를 수정하면 다른 키이므로 공유 메모리 ID가됩니다.

Per the QSharedMemory documentation

:

경고 : 달리 명시되지 않는 한 QSharedMemory가하는 Qt를 특정 방법으로 키를 변경합니다. 비 Qt 응용 프로그램과의 상호 운용은 QSharedMemory()으로 기본 공유 메모리를 먼저 생성 한 다음 setNativeKey()으로 기본 키를 설정하여 달성 한 입니다. 네이티브 키를 사용하는 경우 공유 메모리는 다중 액세스 (예 : lock())에서 보호되지 않으며 이러한 보호를 위해 사용자 정의 메커니즘을 사용해야합니다. 당신이 QSharedMemory를 사용하여 공유 메모리 세그먼트를 생성 할 필요가 있음을 보일 수있을 것입니다

setNativeKey()을 사용하여 새 키를 설정 한 다음 QSharedMemory의 외부에서 그 메모리에 연결합니다.

+0

지적 해 주셔서 감사합니다. 그러나 이것은 효과가 없습니다. 'setNativeKey()'는 새로 생성 된 공유 메모리를 떼어냅니다. 'QSharedMemory shmem (key); shmem.create (SHM_DATASIZE); shmem.setNativeKey (native_key); ' QSharedMemory가 생성하지 않은 공유 메모리에 액세스 할 수없는 것 같습니다. 유일한 방법은 QSharedMemory를 사용하여 SharedMemory를 만들고 다른 응용 프로그램에서 액세스하는 것입니다. 이것은 다소 이상합니다. – mvollmer

+0

@mvollmer'QSharedMemory' 세그먼트에서 실제 키를 얻어 비 Qt 애플리케이션으로 전달할 수 있다면 그 애플리케이션은 그 키를 직접 사용할 수 있어야합니다. Qt에서 세그먼트를 생성하면 [ipcs -m'] (http://man7.org/linux/man-pages/man1/ipcs.1.html)을 사용하여 모든 공유 메모리 세그먼트에 대한 세부 정보를 볼 수 있습니다. –