首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::interprocess_exception -创建shared_memory_object时的library_error异常

boost::interprocess_exception -创建shared_memory_object时的library_error异常
EN

Stack Overflow用户
提问于 2016-06-27 04:16:42
回答 3查看 10.7K关注 0票数 0

在一些罕见的情况下(实际上是在单个客户端的计算机上),下面的代码会引发异常"library_error":

代码语言:javascript
复制
namespace ipc = boost::interprocess;
ipc::shared_memory_object m_shm;
...
bool initAsServer(size_t sharedMemSize)
{
    ipc::permissions perm;
    perm.set_unrestricted();

    try
    {
        m_shm = ipc::shared_memory_object(
            ipc::create_only,
            CNameGenHelper::genUniqueNameUtf8().c_str(), // static std::string genUniqueNameUtf8()
            ipc::read_write, perm);
    }
    catch(const ipc::interprocess_exception& ex)
    {
        logError("failed with exception \"%s\"", ex.what());
        return false;
    }
    ...
}

在日志文件中:异常"boost::interprocess_exception::library_error"导致错误失败

Boost v1.58,platform win32,vs13。

如果你能帮我解决这个问题,我将非常感激。提前谢谢你!

EN

回答 3

Stack Overflow用户

发布于 2016-07-07 05:17:10

出现问题的原因是事件ID = "6005“的事件,源名为"EventLog”在“系统”Windows中。如果系统日志不包含至少一个此类事件,则方法boost::interprocess::winapi::get_last_bootup_time()返回false,boost::interprocess::ipcdetail::windows_bootstamp构造函数抛出异常。(使用了BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME )。

因此,清除“系统”windows事件日志似乎就足够了,任何使用Boost共享内存的应用程序都将停止工作。

多么糟糕的逻辑:使用windows事件日志的内容。似乎这个尚未修复的boost ipc实现错误(boost_1_61_0)。

本例的临时解决方案(计算机的w/o重新启动):

代码语言:javascript
复制
bool fixBoostIpcSharedMem6005issue() const
{
    bool result = false;

    HANDLE hEventLog = ::RegisterEventSourceA(NULL, "EventLog");
    if(hEventLog)
    {
        const char* msg = "simple boost shared memory fix for 6005";

        if(::ReportEventA(hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 6005, NULL, 1, 0, &msg, NULL))
            result = true;

        ::DeregisterEventSource(hEventLog);
    }

    return result;
}

使用它,并再次尝试使用ipc::shared_memory_object :)

票数 3
EN

Stack Overflow用户

发布于 2018-03-09 16:28:28

关于这个问题的许多详细解释,由库的一个作者:Boost进程间:启动时间在Windows上是不可靠的和here:Windows上事件日志的时间使用是完全不可靠的

显然,一个可靠的解决方案是将预处理常量BOOST_INTERPROCESS_SHARED_DIR_PATH定义为函数调用,一旦启动机器,函数调用总是返回与字符串相同的目录路径。例如,格式化文件的更新时间戳,在启动时写入.

票数 1
EN

Stack Overflow用户

发布于 2020-02-18 22:36:22

您可以定义BOOST_INTERPROCESS_BOOTSTAMP_IS_SESSION_MANAGER_BASED或BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME以切换到基于注册表或基于WMI的启动时间检测。或者,您可以使用BOOST_INTERPROCESS_SHARED_DIR_PATH,但是它在Windows上有点没用,因为它使用硬编码的路径。BOOST_INTERPROCESS_SHARED_DIR_FUNC是更好的选择,因为它允许您定义返回共享目录的路径的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38045857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档