前書き
iceoryxは、Publish-Subscribeモデルに基づくプロセス間通信手段を提供するライブラリの一つで、送受信にデータコピー(一時変数への代入など)を伴わないため、比較的オーバーヘッドが小さいことが特長です(Publish-Subscribeモデルとは何かについては他者の説明に委ねます)。開発元情報や、採用しているプロジェクト事例などはここで紹介されています。
通信媒体としてはいわゆるSystem V IPCの共有メモリを使っており、これに準拠したシステムで利用可能です。
共有メモリを使えばゼロコピーにできるのは当たり前じゃないか、と思われるかも知れません。それはごもっともなのですが、実装上は同期や排他処理の工夫が必要で結構ややこしくなるので、そのあたりをしっかり作り込んでいるところがこのライブラリの魅力です。筆者の感覚では、使い方もわりと簡単だと思います。
ドキュメントは本家にしっかり用意されているのですが、日本語でGetting startedしたい人向けの文書が見つからないので、自分で書いてみました。本記事執筆時の筆者の開発環境はUbuntu 22.02LTS + gcc-11.4.0 on WSL2です。
インストール
以下はGNUツール + git + apt + が使える環境であることを前提にしています。gcc、cmake、libacl1、libncurses5、pkg-configあたりが必要になるので、予めインストールしておいて下さい。
% sudo apt install gcc g++ cmake libacl1-dev libncurses5-dev pkg-config
本家リポジトリを手許にクローンします。
% git clone https://github.com/eclipse-iceoryx/iceoryx.git
ビルドはcmakeで行います。筆者自身がcmakeに慣れていないため1次情報がどこに書かれているか(どこに書くべきか)分からないのですが、CMAKE_INSTALL_PREFIX
が/usr/local
に設定されています。これで問題なければ、次の一連のコマンドでインストールまで完了します。
% cd iceoryx
% cmake -Bbuild -Hiceoryx_meta
% cmake --build build
% sudo cmake --build build --target install
サンプルコンパイル&実行
試しにサンプルにあるicehelloをコンパイル&実行してみます。
% cd iceoryx_examples/icehello
コンパイルにはcmakeを使います。
% cmake .
% make
これで、カレントディレクトリに二つの実行ファイルiox-cpp-publisher-helloworldとiox-cpp-publisher-helloworldが出来るはずです。
Publish-Subscribeモデルに必要なメッセージブローカーはiox-roudiで、これは/usr/local/binの下にあります。バックグラウンドで走らせておきましょう。
% /usr/local/bin/iox-roudi &
ちなみに本家のGetting startedによれば、roudiというのは Routing and Discovery の略だそうです。
これで準備は終わりです。ターミナルを二つ起ち上げて、片方で
% ./iox-cpp-publisher-helloworld
もう片方で
% ./iox-cpp-subscriber-helloworld
とすれば、これらが通信している様子が分かると思います。
cmakeを使わずコンパイル&リンクするには?
個人的にはcmakeが好きではないので、直接gccでコンパイルするためのオプションを調べました。上記icehelloの下にあるCMakeFiles/iox-cpp-publisher-helloworld.dir/link.txtを見ると
/usr/bin/c++ CMakeFiles/iox-cpp-publisher-helloworld.dir/iox_publisher_helloworld.cpp.o -o iox-cpp-publisher-helloworld /usr/local/lib/libiceoryx_posh.a /usr/local/lib/libiceoryx_hoofs.a /usr/local/lib/libiceoryx_platform.a -lpthread -lacl -latomic -lrt
と書いてあるので、/usr/local/libの下にあるlibiceoryx_posh.a、libiceoryx_hoofs.a、libiceoryx_platform.aという3つのライブラリをリンクすれば良いと分かります(全て静的ライブラリなのは要注意です)。
また、ヘッダファイルは/usr/local/include/iceoryx/v2.90.0(バージョン番号は実態に合わせて下さい)以下にありますので、例えば
% g++ -Wall -O3 -I/usr/local/include/iceoryx/v2.90.0 -L/usr/local/lib -o hoge hoge.cpp -liceoryx_posh -liceoryx_hoofs -liceoryx_platform
とすれば、ソースファイルhoge.cppから実行ファイルhogeを作ることが出来ます。
次のようなmakefileを作っておくのが良いでしょう。
INCLUDE=/usr/local/include/iceoryx/v2.90.0
LIB=/usr/local/lib
LINK=-liceoryx_posh -liceoryx_hoofs -liceoryx_platform
CXX=g++
CXXFLAGS=-Wall -O3 -I$(INCLUDE) -L$(LIB)
TARGET=publisher subscriber
HEADER=mytopic.h
all: $(TARGET)
%: %.cpp $(HEADER)
$(CXX) $(CXXFLAGS) -o $@ $< $(LINK)
clean:
rm -f $(TARGET) *~
TARGET
とHEADER
は適当に変えて下さい。