2015-02-24 2 views
0

Я переношу исходный код, чтобы открыть/прочитать/записать файл, совместно используемый несколькими процессами. Он хорошо работает под окнами и, как это было в основном с использованием подталкивания :: межпроцессного (1.44) Я не ожидал слишком много вопроса, но я нашел что-то странное:Под Linux boost :: interprocess :: create_or_open_file изменить тип файла

//pseudo code 
namespace bip = boost::interprocess; 
namespace bipd = boost::interprocess::detail; 


loop 
    bip::file_handle_t pFile = bipd::create_or_open_file(filename, bip::read_write); 
    bipd::acquire_file_lock(pFile); 
    // try to read bytes from pFile with 'read' 
    bipd::truncate_file(pFile, 0); 
    bipd::write_file(pFile, (const void*)(textBuffer)), bufLen); 

Когда код запускается в первый раз это создать файл и написать текст. Режим файла - ASCII (ASCII text, with very long lines), и я могу прочитать текст. Но когда цикл выполняется во второй раз, тип файла изменяется на data, а textBuffer находится в файле, но как двоичные данные!

Я осмотрел boost/interprocess/details/os_file_functions.hpp, но я не нашел причины для такого поведения.

У вас есть идея?

ответ

0

Наконец, я нашел решение .... Это ssems, что если вы в конце файла (позиция указателя файла после ::read), функция ::ftruncate используется в реализации `повышающего :: межпроцессного: : detail :: truncate_file "приводят к неправильному поведению.

Чтобы поддерживать такое же поведение в Linux и Windows (сохраняйте мой тип файла как текст ASCII), я использовал простой ::seek(id,0,SEEK_SET).

Я не нашел этот трюк на всех страницах, которые я читал!

Смежные вопросы