IPC
[[ Rust ]]でIPC(プロセス間通信)をする。
選択肢
- stdin/stdoutでがんばる
- UNIX domain socket (stream/datagram)
- std::os::unix::net::UnixStream, UnixDatagram で実装できる
- one-to-many
- 半二重?
- Unix Stream Socketを使う
- unnamed/named pipe (=
mkfifo
で作られるもの?)- one-to-oneで、半二重通信。相互通信をするには二本pipeを張る
- Named pipeはどこかにファイルを置いて、それに接続する形になる。unnamed pipeは基本的に親子プロセス間に使う(生成時にpipeを渡せるので)。
- mkfifoとbincodeによる実装例 (credit: Alice Ryhl)
- bincodeはRustのデータをシリアライズするライブラリ
- Rubyでいうmarshal
- でもこういうのバグ作りがち
- bincodeはRustのデータをシリアライズするライブラリ
- DBus
- dbus クレート
- メッセージキュー:ZeroMQ, RabbitMQ, nanomsg…
- zmq クレート
- 更新されていない。クロスコンパイルするときにライブラリのバージョンが噛み合わなくてうまくいかなかった。
- zmq クレート
- ローカルHTTPサーバ
- なんかまわりくどいけど、Web慣れてるとこれがラクなのは否めない
- ローカルTCP, UDPサーバ
- 比較的楽
- 各種RPCプロトコル
- gRPC
- xml-rpc
- ipc-channel servoが作ってる。Rust同士なら会話できる。
- tarpc : Rust同士でしか使えない?
- interprocess unix, windowsが提供するIPCメカニズムをいろいろ使える