2015-02-24 60 views
0

我正在移植源代碼以打開/讀取/寫入多個進程之間共享的文件。它的工作原理以及在Windows下,當它主要是使用boost ::進程間(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後,文件指針的位置),在`的boost ::進程間的執行中使用的::ftruncate功能: :detail :: truncate_file'導致不正確的行爲。

在Linux和Windows下保持相同的行爲(保持我的文件類型爲ASCII文本),我使用了一個簡單的::seek(id,0,SEEK_SET)

我在所有閱讀過的頁面中都找不到那個技巧!