Boost.Interprocess でアプリケーショの多重起動を防止する
この手の処理はいくつか手段があると思うのですが、Boost.Interprocess で書いてみました。
[ソース]
#include <boost/interprocess/managed_shared_memory.hpp> #include <cstdio> #include <string> #include <cstdlib> int main(int argc, char* argv[]){ namespace ipc = boost::interprocess; try{ ipc::shared_memory_object segment(ipc::create_only, "MyApp", ipc::read_write); } catch(std::exception const& exp){ // std::cout << exp.what() << std::endl; std::cout << "NG" << std::endl; getchar(); std::exit(1); } std::cout << "OK" << std::endl; getchar(); ipc::shared_memory_object::remove("MyApp"); return 0; }
最初に起動した時には『OK』が出力され、それが実行している場合、以降は『NG』と出力されます。
要は最初に共有メモリを作って置いて、既に共有メモリが存在している場合は終了するような仕組みです。
Boost.Interprocess あんまり使ったことがないのでもっとスマートな方法があるかも知れない。
(元々は環境に依存するようなコードを書きたくなかった。
[boost]
- ver 1.53.0