【发布时间】:2026-02-10 15:10:01
【问题描述】:
我正在处理一个使用g++ 编译的共享对象,该对象用作日志记录 API。我编写了一个小实用程序来练习该库,但我发现每次程序启动和退出时都会调用共享对象构造函数/析构函数。我希望能够维护.so 文件中任何变量/对象的状态,即使没有链接活动的应用程序。有没有实现这一点的机制?
【问题讨论】:
标签: c++ c++11 shared-libraries
我正在处理一个使用g++ 编译的共享对象,该对象用作日志记录 API。我编写了一个小实用程序来练习该库,但我发现每次程序启动和退出时都会调用共享对象构造函数/析构函数。我希望能够维护.so 文件中任何变量/对象的状态,即使没有链接活动的应用程序。有没有实现这一点的机制?
【问题讨论】:
标签: c++ c++11 shared-libraries
我希望能够维护 .so 文件中任何变量/对象的状态,即使没有链接的活动应用程序也是如此。有没有实现这一点的机制?
在现代操作系统中,内存中的所有内容都“属于”一个或多个进程,并且不存在“没有活动应用程序的.so”之类的东西。
此外,当您的 .so 链接到多个活动应用程序(正在运行的进程)时,仍然没有您的库可以记录的共享状态 - 您的 .so 的每个实例都会无法观察到该.so 的其他实例在其他进程中处于活动状态,除非使用某些IPC 机制。
您可以使用shmat 创建一个共享内存段,并在那里记录共享状态。该状态也将持续存在,直到通过 smtctl 系统调用显式删除。
当心:以这种方式使用共享内存充满了复杂性,并且很可能对于日志 API 库来说太过分了。
【讨论】:
shared_ptrs。因此,如果一个进程创建了一个接收器,而另一个取消引用说接收器.....段错误。可能只需要放弃系统级目标并让 API 像当前一样运行