【问题标题】:C++ shared object initialization constructor destructorC++共享对象初始化构造函数析构函数
【发布时间】:2026-02-10 15:10:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,我确实尝试过使用您提到的共享内存方法,但我正在包装的日志库大量使用shared_ptrs。因此,如果一个进程创建了一个接收器,而另一个取消引用说接收器.....段错误。可能只需要放弃系统级目标并让 API 像当前一样运行
    最近更新 更多