In Anwendung 1 (C-Code) im mit einem gemeinsam genutzten Speicher wie folgt zu erstellen:Attach vorhandenen Shared Memory mit 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);
In Anwendung 2 (QT) Ich mag dieses Shared
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;
}
zugreifen möchtenattach fehlgeschlagen "QSharedMemory :: attach (shmget): existiert nicht" "16858191" "/ tmp/qipc_sharedmemory_24384b85e5d54b23bd4f84f14de71b10d4801666"
Also versuchte ich habe die folgende
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;
}
attach fehlgeschlagen "QSharedMemory :: attach (shmget): existiert nicht" "" "/ tmp/shmem_prot"
Ich habe einen Blick auf die Quelle von qsharedmemory_unix.cpp
Ich denke, das Problem ist, dass unix_key nicht gesetzt ist, so dass shmget in attach() fehlschlagen wird. handle() ist privat, daher kann ich diese Funktion nicht aufrufen, um den unix_key zu setzen.
Ist es möglich, auf den Shared Memory zuzugreifen, ohne die Größe zu kennen/create() aufzurufen?
Wenn ich versuche, erstellen zu nennen()
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);
ein neues Shared Memory wird erstellt ...
Was mache ich falsch? Danke im Voraus.
gibt es 2 Dinge, die ich denke, könnte Probleme verursachen. Erstens, lösen Sie die Erinnerung, wenn Sie damit fertig sind? Zweitens: Verwenden Sie Semaphor-Signale, um Mehrfachzugriff auf den Speicher zu verhindern? und für die Befestigung kenne ich keine Funktion, die Sie verwenden können, die die Größe des Bereichs nicht benötigt.Aber "vielleicht" können Sie versuchen, einen anderen Bereich mit nur einer Ganzzahl (oder etwas) zu erstellen, um die Größe des ersten zu halten. Und benutze es, um es danach zu befestigen. viel Glück – koksalb
Welches Betriebssystem? Angenommen, Sie haben das Dienstprogramm "ipcs", was ist die Ausgabe von "ipcs-a"? Das sollte alle SysV Shared Memory-Segmente auf Ihrem Computer anzeigen. –
@koksalb Wir können über das Trennen und Semaphoren sprechen, wenn der Shared Memory erfolgreich angehängt wurde. Aber in diesem Zustand spielt das keine Rolle. – mvollmer