以下のコードは、MyMappedFile
というファイルを作成して読み取ります。 Linux(Ubuntu 14.04)で書込みコードを実行すると、このファイルを他のLinuxマシンにコピーしても問題ありません。私が代わりにOSXに転送し、その上に読み取ったコードを実行しようとすると、私はエラーを取得:管理されたマップされたファイルをブースト:OSXとLinuxでは互換性がありませんか?
libc++abi.dylib: terminating with uncaught exception of type boost::interprocess::lock_exception: boost::interprocess::lock_exception
逆に、OSX上で書かれたファイルはOSX上で読むことができます。しかし、Linuxでそれらを読むと、私に似たようなメッセージが出てきます。
terminate called after throwing an instance of 'boost::interprocess::lock_exception'
what(): boost::interprocess::lock_exception
結果のファイルは異なります。
私はこのコードを書いている:
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
namespace bip=boost::interprocess;
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::basic_string<char, std::char_traits<char>, bip::allocator<char, segment_manager_t> > shared_string;
int main() {
bip::managed_mapped_file *outfile = new bip::managed_mapped_file(bip::create_only, "MyMappedFile", 1000);
outfile->find_or_construct<shared_string>("mystring")("bubza", outfile->get_segment_manager());
outfile->flush();
}
そして、これを読んで:
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
namespace bip=boost::interprocess;
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::basic_string<char, std::char_traits<char>, bip::allocator<char, segment_manager_t> > shared_string;
int main() {
bip::managed_mapped_file *infile = new bip::managed_mapped_file(bip::open_only, "MyMappedFile");
shared_string *ptr = infile->find_or_construct<shared_string>("mystring")(infile->get_segment_manager());
std::cout << "I got " << *ptr << std::endl;
}
両方のマシンは、GCC 4.8(Linuxでは4.8.4、OSX上で4.8.5)を使用していますブースト1.55。
これらのプラットフォームでファイルが互換性がないのはなぜですか?
私は書き込みコードによって生成されたMyMappedFile
データファイルについて話しています。コードをコンパイルすることによって生成された実行ファイルはマシン間で転送されません。LinuxコードはLinuxマシンでコンパイルされ、OSXコードはOSXマシンでコンパイルされます。
'なぜこれらのプラットフォームでファイルが互換性がないのですか? ' いくつか例を共有してください。推測できません。典型的な理由には、標準ストリームを使用している場合のエンディアン、または異なるロケールが含まれます。 – sbabbi
Linuxで書かれたファイルは、http://so.con.com/MyMappedFile.linux、OSXはhttp://so.con.com/MyMappedFile.osxで書かれています。 –
LinuxとOSXはどちらも少しですendianが問題であることをファイルのクイックスキャンからは表示されません。上記のコードは何が関係しているかの全体的なものなので、標準のストリームが使用されている場合、Boostによって行われ、私のコードでは行われないことに注意してください。しかし、私はBoostがストリームではなく 'mmap()'を使用すると期待します。 –