QSharedMemory を使用していくつかのデータを保存しており、その後、そこに含まれているものにデータを追加したいと考えています。そこで、新しいデータで次のコードを数回呼び出します。「audioBuffer」は、この関数に与えられた新しいデータです。memcpy 操作でエラーを検出する前に、この関数を約 4 ~ 7 回呼び出すことができます (時間はさまざまです)。QSharedMemory の場所のサイズは非常に大きいため、セグ フォールトの前に行ういくつかの呼び出しでは、memcpy が境界を越えてデータをコピーするという問題はありません。また、m_SharedAudioBuffer.errorString() は memcpy 操作までエラーを出しません。現在、この QSharedMemory セグメントを使用するプロセスは 1 つだけです。また、毎回追加せずに継続的に書き込もうとしましたが、それは正常に機能するため、共有メモリセグメントにさらにデータを追加しようとすると何かが発生します. 何か案は?ありがとう!
// Get the buffer size for the current audio buffer in shared memory
int bufferAudioDataSizeBytes = readFromSharedAudioBufferSizeMemory(); // This in number of bytes
// Create a bytearray with our data currently in the shared buffer
char* bufferAudioData = readFromSharedAudioBufferMemory();
QByteArray currentAudioStream = QByteArray::fromRawData(bufferAudioData,bufferAudioDataSizeBytes);
QByteArray currentAudioStreamDeepCopy(currentAudioStream);
currentAudioStreamDeepCopy.append(audioBuffer);
dataSize = currentAudioStreamDeepCopy.size();
//#if DEBUG
qDebug() << "Inserting audio buffer, new size is: " << dataSize;
//#endif
writeToSharedAudioBufferSizeMemory( dataSize ); // Just the size of what we received
// Write into the shared memory
m_SharedAudioBuffer.lock();
// Clear the buffer and define the copy locations
memset(m_SharedAudioBuffer.data(), '\0', m_SharedAudioBuffer.size());
char *to = (char*)m_SharedAudioBuffer.data();
char *from = (char*)audioBuffer.data();
// Now perform the actual copy operation to store the buffer
memcpy( to, from, dataSize );
// Release the lock
m_SharedAudioBuffer.unlock();
編集:おそらく、これは私のターゲットの組み込みデバイスが非常に小さいためです。共有メモリに書き込もうとすると、使用可能な RAM が大きくなりますが、/tmp ディレクトリ (4Mb しか指定されていません) に次のエントリがあることに気付きました。メモリを割り当てられなかった理由がわかりません。また、QSharedMemory::create メソッドが最大サイズの 960000 で失敗することはありません。
# cd /tmp/
# ls
QtSettings
lib
qipc_sharedmemory_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_sharedmemory_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qipc_systemsem_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_systemsem_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qtembedded-0
run