LoginSignup
6
2

More than 5 years have passed since last update.

boost::interprocess::message_queueを使ってプロセス間通信

Posted at

はじめに

message_queueを使うと、別プロセス間(それぞれ別に起動している異なるアプリ間など)で簡単に通信をすることができます。

準備

送受信するデータ構造を定義しておきます。

データ構造の定義
struct Data {
 .....
};

なんでもいいです。ただし、送受信側両方で知っておく必要があります。

受信

受信用キューを作成します。

キュー作成
// キュー作成。識別用として、固有のキーを指定します
boost::interprocess::message_queue msgq( boost::interprocess::create_only, "UNIQUE_KEY_HOGEHOGE", max_msg_num, sizeof(Data) );

受信をします

受信

Data message;
uint64_t recv_size;
unsigned priority;
msgq.receive( &message, sizeof(Data), recv_size, priority );

タイムアウト付き受信もあります

タイムアウト付き受信

// タイムアウト「時刻」を指定するようです
boost::posix_time::ptime timeout = boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds( 100 ); // 今から100ms後

if ( msgq.timed_receive( &message, sizeof(Data), recv_size, priority, timeout ) ) {
  // 受信成功
} else {
  // タイムアウト
}

送信

次は送信です。

キュー作成
boost::interprocess::message_queue msgq( boost::interprocess::open_only, "UNIQUE_KEY_HOGEHOGE" );

送信
Data data
data.xxx = xxxxx;
..

msgq.send( &data, sizeof(Data), 0 );

受信と同様にタイムアウト付きのtimed_sendなどもあります。

おわりに

送信も受信も、失敗すると例外を投げてくるので、実際はtry~catchを使ってエラー処理します。

クライアント・サーバー型で送受信する場合の例ですが、
例えばサーバー側では公開した固有のキーで受信待ちループを回しておき
クライアントは、そのキーめがけて送信します。このとき、送信データの中にクライアント自身が生成した受信用固有キーを入れておきます。
サーバーは受信後、その受信用固有キーに対して返信する、という方法で1対多の接続をさばくことができます。

以上、boost::interprocess::message_queueの基本的な使い方をご紹介しました。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2