2016-03-23 8 views
0

以下のコードは、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マシンでコンパイルされます。

+0

'なぜこれらのプラットフォームでファイルが互換性がないのですか? ' いくつか例を共有してください。推測できません。典型的な理由には、標準ストリームを使用している場合のエンディアン、または異なるロケールが含まれます。 – sbabbi

+0

Linuxで書かれたファイルは、http://so.con.com/MyMappedFile.linux、OSXはhttp://so.con.com/MyMappedFile.osxで書かれています。 –

+0

LinuxとOSXはどちらも少しですendianが問題であることをファイルのクイックスキャンからは表示されません。上記のコードは何が関係しているかの全体的なものなので、標準のストリームが使用されている場合、Boostによって行われ、私のコードでは行われないことに注意してください。しかし、私はBoostがストリームではなく 'mmap()'を使用すると期待します。 –

答えて

0

RE:なぜこれらのプラットフォームでファイルが互換性がないのですか?

OS XとLinuxは異なるkernelsABIを使用しているため、異なる方法でコードをコンパイルします。 Linuxは一般にELFのファイル形式を使用し、OS XはMach-Oを使用します。これらはプラットフォーム固有のものです。

EDIT:出力が異なる理由は分かりません(共有されていません)。

+0

Boostはどのように具体的には異なるプラットフォームで異なる出力を書き込むのですか? –

+0

コンパイルされていないプラットフォームでコードを実行しようとすると、あなたのコードが 'std:exception'をスローするため、私はそれに従います。 –

+0

いつ出力が違うのか何か言ったのですか? –