2013-04-03 11 views
5

Najpierw opiszę domenę źródłową.Zwiększ alokację międzyprocesową - zarządzaj rozmiarem pliku

namespace bip=boost::interprocess; 

typedef bip::allocator<int, bip::managed_mapped_file::segment_manager> allocator; 
typedef bip::vector<int, allocator> vector; 

bip::managed_mapped_file m_file(open_or_create, "./file", constant_value);  
bip::allocator alloc(m_file.get_segment_manager()); 
bip::vector *vec = m_file.find_or_construct<vector>("vector")(alloc); 

Nie dbam o ostateczny rozmiar pliku bazowego, ale nie mogę przewidzieć tej wartości. Czy istnieje mechanizm doładowania, który będzie obsługiwał zmienianie rozmiaru pliku bazowego? Czy muszę złapać bip :: bad_alloc i dbać o to przez siebie?

Odpowiedz

6

Przeczytaj ten dokument this section dokumentów.

Masz statycznej funkcji składowej grow() że może być to, czego potrzebujesz:

bip::managed_mapped_file::grow("./file", extra_bytes); 

Ale trzeba mieć pewność, że nikt nie korzysta z pliku, to dlaczego nazywają go off-line rośnie. A to może nie być możliwe w zależności od problemu.

+0

Oh. Tak prosty. Muszę przyznać, że bountring po rozwiązywaniu podobnych wyzwań bezpośrednio na POSIX mmap i przy użyciu Boost IOstreams. Zobacz np. Tę odpowiedź [jak zamienić jedną linię na drugą w C++] (http://stackoverflow.com/a/17374711/85371). Zastanawiam się, jak zaimplementowali go, aby był przenośny. – sehe

Powiązane problemy