一次只访问一个可执行文件到 .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 布局随机化使此优化不太有用。
我正在开发一个 运行 可执行文件系统(并通过 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 布局随机化使此优化不太有用。