一次只访问一个可执行文件到 .so 库中的函数

Accessing only one executable at a time to a function in .so library

我正在开发一个 运行 可执行文件系统(并通过 ROS 进行通信)。我有一个 .json 配置文件,它对所有可执行文件都是通用的,还有一个 libCommon.so,它是一个函数库,可以从 .json 中读取某些值。该库静态链接到 CMakeLists.txt:

中的所有可执行文件
set(NAME exec1)
target_link_libraries(${NAME} ... Common)

随着系统的启动,所有的 exec 都需要一个接一个地启动 - 就像 bash 脚本中的那样:

./exec1 & ./exec2

等等

问题

我使用的 .json 解析器给我断言错误,我发现这些错误是可执行文件的症状 运行ning 它们的构造函数并立即访问相同的配置文件;

所以,我尝试了一些带有全局互斥体(std::mutex busy)的东西,它在头文件中声明并在 libCommon.so 的 cpp 中定义。然后,它在每个函数的入口处被锁定并在 return 语句之前解锁:

Common.h

namespace jsonFunctions
{
extern std::mutex busy;
namespace ROS
{
extern double readRosRate( configFiles::fileID configID );
}
...
}
class ConfigFile
{
public:
    ConfigFile( configFiles::fileID configID )
    {
        configFileFstream.open( configFiles::filePaths.at( configID ) );
        if( configFileFstream.is_open() )
        {
            parsedFile.parse( configFileFstream );
        }
    }
    ~ConfigFile()
    {
        configFileFstream.close();
    }

public:
    jsonxx::Object parsedFile;
    
private:
    std::fstream configFileFstream;
};

Common.cpp

namespace jsonFunctions
{
std::mutex busy;
namespace ROS
{
double readRosRate( configFiles::fileID configID )
{

busy.lock();
ConfigFile* desiredConfigFile = new ConfigFile( configID );

auto rosConfig = desiredConfigFile->parsedFile.get< jsonxx::Object >( "ROS" );

delete desiredConfigFile;
busy.unlock();
return rosConfig.get< jsonxx::Number >( "rate" );
}

但这不起作用。 我应该如何阻止可执行文件同时访问配置文件?

可执行文件存在于它们自己的内存中space。它们不与其他可执行文件共享内存,即使它们都使用相同的共享库1.

标准 C++ 中没有进程间互斥。你必须从标准之外找到一个进程间互斥锁。

boost 有它们,大多数 OS 文件系统 API 都可以用来创建它们。

一些 OS API 允许您以独占模式打开文件。其他人依赖于您创建的显式锁。在某些情况下,此功能可能取决于您正在访问的文件系统,甚至取决于您访问它的方式。

显然 one way 这样做是在你们共享的特定位置打开 open("unique_name.lock", O_CREAT|O_EXCL, 0777)。一次只能有一个进程 unique_name.lock 以这种方式打开。

另一种是使用flock.


1 好吧,只读页面有时会被一些 OS 的进程共享;像可执行代码。甚至读写页面也可以写时复制共享。然而,这种分享的发生“就好像”它没有发生一样。此外,地址 space 布局随机化使此优化不太有用。