6

Qt を使用してファイルをメモリ ページにマップしています

QFile::map (qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)

基本的に、これはmmapシステム関数呼び出しである必要があります。ディスク上のファイルが切り捨てられている場合でも、返されたメモリにアクセスできることをどのように保証できるのだろうか。ディスクファイルから読み取り、エラーを適切に処理したいので、これが必要なようです

if (offset > m_file.size()) 
  // throw an error...
if (m_mappedFile != NULL) return m_mappedFile + offset;

明らかに、これには競合状態が含まれます。これは、チェックとマッピングへのアクセスの間でファイル サイズが変化する可能性があるためです。どうすればこれを回避できますか?

4

1 に答える 1

3

からman mmap:

SIGBUS Attempted  access to a portion of the buffer that does not correspond to the file
       (for example, beyond the end of  the  file,  including  the  case  where  another
       process has truncated the file).

そのため、SIGBUS 用のシグナル ハンドラをインストールする必要があります (デフォルトではプログラムをクラッシュさせます)。

于 2013-03-28T14:19:45.810 に答える