@@ -107,6 +107,11 @@ int main(int argc, char **argv) {
107
107
" tcp timeout in seconds. Set to 0 to use the system defaults (not recommended)." ,
108
108
cxxopts::value<std::size_t >()->default_value (" 5" ))
109
109
#endif
110
+ (" force" ,
111
+ " Force the use of the shared memory even if it already exists. "
112
+ " Do not use this option per default! "
113
+ " It should only be used if the shared memory of an improperly terminated instance continues "
114
+ " to exist as an orphan and is no longer used." )
110
115
(" h,help" ,
111
116
" print usage" )
112
117
(" version" ,
@@ -181,18 +186,25 @@ int main(int argc, char **argv) {
181
186
}
182
187
183
188
// create shared memory object for modbus registers
184
- Modbus::shm::Shm_Mapping mapping (args[" do-registers" ].as <std::size_t >(),
185
- args[" di-registers" ].as <std::size_t >(),
186
- args[" ao-registers" ].as <std::size_t >(),
187
- args[" ai-registers" ].as <std::size_t >(),
188
- args[" name-prefix" ].as <std::string>());
189
+ std::unique_ptr<Modbus::shm::Shm_Mapping> mapping;
190
+ try {
191
+ mapping = std::make_unique<Modbus::shm::Shm_Mapping>(args[" do-registers" ].as <std::size_t >(),
192
+ args[" di-registers" ].as <std::size_t >(),
193
+ args[" ao-registers" ].as <std::size_t >(),
194
+ args[" ai-registers" ].as <std::size_t >(),
195
+ args[" name-prefix" ].as <std::string>(),
196
+ args.count (" force" ) > 0 );
197
+ } catch (const std::system_error &e) {
198
+ std::cerr << e.what () << std::endl;
199
+ exit (EX_OSERR);
200
+ }
189
201
190
202
// create slave
191
203
std::unique_ptr<Modbus::TCP::Slave> slave;
192
204
try {
193
205
slave = std::make_unique<Modbus::TCP::Slave>(args[" ip" ].as <std::string>(),
194
206
args[" port" ].as <uint16_t >(),
195
- mapping. get_mapping (),
207
+ mapping-> get_mapping (),
196
208
#ifdef OS_LINUX
197
209
args[" tcp-timeout" ].as <std::size_t >());
198
210
#else
0 commit comments