1

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
4

1 に答える 1

0

問題は、共有メモリ セグメントから返されたポインタで QByteArray の ::fromRawData を使用していたことにあるようです。このポインターで memcpy を使用してそのデータを明示的にコピーし、コピーしたデータを使用して QByteArray を構築すると、セグ フォールトが停止しました。

于 2013-03-20T18:30:29.383 に答える