• ベストアンサー

mmap()を使ったファイルへの書き込みで…

あるファイルへの書き込みの一連の処理で test(){ open() mmap() write() close() } という流れで行うと何も問題ないのですが、 この流れをループで行っていると1万回を超えたあたりでopen()がNGになりますが、何故でしょう? ちなみにループの中でclose()するのを忘れると1千回を超えたあたりでopen()がNGになるのは #define FD_SETSIZE 1024 だからという予想で合っているでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

お酒が入っているので、確認しません。記憶だけで。 「この流れをループで行っていると1万回を超えたあたりでopen()がNGになりますが、何故でしょう?」 munmap() していないので、メモリ空間が無くなったのではないでしょうか?mmap() のサイズが 4KB とすると 1000回やって 4GB ですから。メモリ空間(あるいは mmap() できるアドレス空間)が足りなくなっても不思議ではないですね。 「ちなみにループの中でclose()するのを忘れると1千回を超えたあたりでopen()がNGになるのは #define FD_SETSIZE 1024 だからという予想で合っているでしょうか?」 ここはちょっと OS 依存ですが、Linux(Unix) だったらプロセスがオープンできるファイル数の上限が setrlimit() で設定できます。FD_SETSIZE は select(2) で使われる struct fdset における fd の上限というのが正しいハズ。勿論実装によっては FD_SETSIZE 以上にファイルをオープンできない、というのは十分に考えられます。

uya_15
質問者

お礼

ご指摘通りメモリの枯渇だったみたいです

その他の回答 (1)

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

再度 No.1 です。すいません、肝心な事を書き忘れました。 普通(?)、mmap() したらファイルには書かないように思います。少なくととも私はそういうプログラムは書いた事がないし、見た事もないです。write() した内容がちゃんと反映されてますか? よくあるのは、mmap() したメモリ領域に書き込んで、sync()(Linux なら msync() だったかな?fsync() というのもあったような)で、メモリの内容をファイルに反映させます。つまり、mmap() されているからといって、メモリに書いた内容はすぐさまファイルに反映はされないのです。逆に、ファイルの内容をmmap()されたメモリに強制的に反映させる術はないんじゃないかな。 mmap() された領域を書き換えると、いちいち lseek() しなくて済みますし、(sync()するまで)ファイルに書き込みにいきませんので(最近の OS ではファイルへの書き込みはメモリにキャッシュされますが、それでも)速い(ハズ)です。

uya_15
質問者

お礼

質問内容とは違うことまでお心遣い頂き、ありがとうございます。 とりあえずwrite()でも書き込めているように見えるのですが、いくつか疑問点があるのでそれは別途質問出します。

関連するQ&A