managed_mapped_fileの方が楽でした
前回記事の続きで、boost.interprocessのmanagedの方が楽でしたよ、という話。
Class template basic_managed_mapped_file - 1.45.0
作成されてなかったら指定サイズで作成してしまう、とかmapped_regionを作らずともそれがそれ自体がマッピングオブジェクトであり、マップビューでもあるようです。writeで開いたファイルはリサイズもできるそうです(file_mappingの方では確かできなかったはず)。他にもallocateとかconstructだとかdestroyだとかよくわからないメソッドがいっぱいあって一体何に使うのかまだよく分かってませんが、今のところはfile_mapping + mapped_region + α + ...と言った感じで記憶しました。
前回の最後のコードをmanagedの方で書き直すとこんな感じです。
#include <boost/interprocess/managed_mapped_file.hpp> #include <boost/filesystem/v2/convenience.hpp> #include <string> #include <iostream> int main() { namespace bip = boost::interprocess; const std::string FilePath( "test.ogg" ); const std::string CopyName( "copy.ogg" ); try { auto const size = boost::filesystem::file_size(FilePath); bip::managed_mapped_file mapsrc( bip::open_read_only, FilePath.c_str() ); // open_read_onlyで読み込み専用で開く…だよね? bip::managed_mapped_file mapdst( bip::open_or_create, CopyName.c_str(), size ); BOOST_ASSERT( mapsrc.get_size() == mapdst.get_size() ); memcpy( mapdst.get_address(), mapsrc.get_address(), mapsrc.get_size() ); } catch( std::exception e ) { std::cerr << e.what() << std::endl; } }
コピー元として開くファイルが何か指定がおかしいのか、なぜか開くことができずに例外を投げてきます。しかも例外内容が"Unknown Exception"…なんだか分かりませんがな。内部使用を見ないといけないようです。せめて例外内容は分かりやすく書こうと思ったのでした。※dstの方はsrcをfile_mapping + mapped_regionにしてちゃんと動くのを確認してます。
既に存在するファイルをmanagedで開く場合は対応するフォーマットでないといけないようです。フォーマットが異なる場合はfile_mapping+mapped_regionで開くことになりそうです。