【问题标题】:C++ shared object initialization constructor destructorC++共享对象初始化构造函数析构函数
【发布时间】:2020-10-22 21:00:55
【问题描述】:

我正在处理一个使用g++ 编译的共享对象,该对象用作日志记录 API。我编写了一个小实用程序来练习该库,但我发现每次程序启动和退出时都会调用共享对象构造函数/析构函数。我希望能够维护.so 文件中任何变量/对象的状态,即使没有链接活动的应用程序。有没有实现这一点的机制?

【问题讨论】:

    标签: c++ c++11 shared-libraries


    【解决方案1】:

    我希望能够维护 .so 文件中任何变量/对象的状态,即使没有链接的活动应用程序也是如此。有没有实现这一点的机制?

    在现代操作系统中,内存中的所有内容都“属于”一个或多个进程,并且不存在“没有活动应用程序的.so”之类的东西。

    此外,当您的 .so 链接到多个活动应用程序(正在运行的进程)时,仍然没有您的库可以记录的共享状态 - 您的 .so 的每个实例都会无法观察到该.so 的其他实例在其他进程中处于活动状态,除非使用某些IPC 机制。

    可以使用shmat 创建一个共享内存段,并在那里记录共享状态。该状态也将持续存在,直到通过 smtctl 系统调用显式删除。

    当心:以这种方式使用共享内存充满了复杂性,并且很可能对于日志 API 库来说太过分了。

    【讨论】:

    • 感谢您的回复,我确实尝试过使用您提到的共享内存方法,但我正在包装的日志库大量使用shared_ptrs。因此,如果一个进程创建了一个接收器,而另一个取消引用说接收器.....段错误。可能只需要放弃系统级目标并让 API 像当前一样运行
    猜你喜欢
    • 2012-03-05
    • 2013-05-23
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多