ROSのようなプロセス間通信(IPC)を、もっとOSが用意している基本的な方法でできないのかと思い、調査してみた。主にLinuxを対象に調べている。可能ならBSD系などでも使えたらいい。
やりたいこと
- プロセス間で、できるだけ低遅延で任意のデータのやり取りをしたい。
- ROS topicのようなPub/Subがしたい。
- POSIXのような枯れた仕組みであるといい。
主なIPC方式
LinuxにおけるIPCの種類としては以下の物があるらしい。
共有メモリ
プロセス間でメモリを共有する仕組み。排他制御は自前で実装する必要がある。
セマフォ
整数型のデータを親子関係のないプロセス間で共有する仕組み。
マップトメモリ
複数のプロセスがファイルを介して通信する。ファイルとは言え通常のファイルではなく、メモリにマップされた仮想的なものになるらしい。
パイプ
親子関係のあるプロセスでデータ交換する仕組みで、コマンドラインで使われる「|」らしい。任意のプロセス間で使えるものではないとのことで、今回の用途には合わない。
FIFO
名前付きpipeとも呼ばれ、全てのプロセスが作成・アクセス・削除できる。 mkfifoコマンド、mkfifo関数によって作成できる。 排他制御も自動でやってくれるらしい。 macOSのmanで確認したところ以下のように記載があり、1988年策定のPOSIXにより規定されているとのこと。
IEEE Std 1003.1-1988 (``POSIX.1'')
ライブラリ関数かと思ったが、システムコールらしい。
ソケット通信
おなじみソケット通信。ネットワーク上とも通信できる。
POSIX メッセージキュー
プロセス間でメッセージの形でのデータのやり取りを行えるらしい。(調査中)
使えそうなのはどれなのか?
上記の中では、名前付きPIPEがもっともあっていそうだ。POSIXのシステムコールならOS間での可搬性もありそう。書き込み終了のハンドリングを行ってくれるのも便利そうだ。
mkfifoの場合、情報のやり取りはUNIX系のファイルやソケットと同様open/read/writeなどを使用して行うようだ。
今後の課題
- raw dataの送受信の仕組みを利用して、callbackのような仕組みを実現するにはどうしたらいいのだろう。
参考
- https://qiita.com/MoriokaReimen/items/5c4256ef620499a88bb3
- https://blog.cles.jp/item/10135
- https://qiita.com/n01e0/items/5484dbdc940baa4fde56