Linux下 boost::interprocess::create_or_open_file 改变文件类型

Posted

技术标签:

【中文标题】Linux下 boost::interprocess::create_or_open_file 改变文件类型【英文标题】:Under Linux boost::interprocess::create_or_open_file change the file type 【发布时间】:2015-02-24 16:48:06 【问题描述】:

我正在移植源代码以打开/读取/写入在多个进程之间共享的文件。它在 windows 下运行良好,因为它主要使用 boost::interprocess (1.44) 我没想到会有太多问题,但我发现了一些奇怪的东西:

//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),我可以阅读文本。 但是当循环第二次运行时,文件类型更改为 datatextBuffer 在文件中,但作为二进制数据!

我检查了boost/interprocess/details/os_file_functions.hpp,但没有找到导致这种行为的原因。

你有什么想法吗?

【问题讨论】:

【参考方案1】:

最后,我找到了解决方案.... 它ssems,如果你在文件的末尾(::read 之后的文件指针位置),在 `boost::interprocess::detail::truncate_file' 的实现中使用的::ftruncate 函数会导致不正确的行为.

为了在 Linux 和 Windows 下保持相同的行为(保持我的文件类型为 ASCII 文本),我使用了一个简单的 ::seek(id,0,SEEK_SET)

我没有在我阅读的所有页面中找到那个技巧!

【讨论】:

以上是关于Linux下 boost::interprocess::create_or_open_file 改变文件类型的主要内容,如果未能解决你的问题,请参考以下文章

linux下配置mysql 以及 linux下开启守护进程

linux下安装svn

arm-linux下如何安装GDB?pc-linux下如何升级GDB?

怎样在linux下进行java编程

linux 文字终端下输入汉字

linux下vim 查找命令