で、既存の共有メモリを取り付け1(Cコード)イムこのような共有メモリを作成する:私は、この共有メモリアプリケーションでは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)でを "16858191" "を/ tmp/qipc_sharedmemory_24384b85e5d54b23bd4f84f14de71b10d4801666":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);
に失敗しました "が存在しない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);
新しい共有メモリが作成されます...
は私が間違って何をしているのですか?前もって感謝します。
問題が発生すると思われる2つのことがあります。 1つ、あなたはそれで終わったときにメモリを取り外すのですか? 2つのセマフォー信号を同時に使用して、メモリーへの多重アクセスを防止しますか?あなたが使用することができる機能を知っていない添付のために、その領域のサイズを必要としません。しかし、 "多分"あなたは、最初のもののサイズを保持するためにただ1つの整数(または何か)を持つ別の領域を作成しようとすることができます。その後、それを取り付けて使用してください。幸運 – koksalb
どのようなOSですか?あなたが 'ipcs'ユーティリティを持っていると仮定すると、' ipcs -a'の出力は何ですか?それはあなたのマシン上のすべてのSysV共有メモリセグメントを表示するはずです。 –
@koksalb共有メモリーが正常に接続されたときの切り離しとセマフォについて説明します。しかし、この状態ではこれは問題ではありません.. – mvollmer