ElixirとCのコミュニケーション方法についてまとめてみました.
Native Implemented Functions (NIFs)
- ElixirからCへは,NIF関数の呼び出しとして実現し,所定のインタフェースを使って引数をC側で取り出します.
- CからElixirへは,
enif_send
を用います.サンプルプログラムはこちら: https://github.com/zacky1972/nif_send_sample
NIFの欠点は,Cプログラムがアボートすると,Erlang VMごと異常終了することです.防ぐ方法は下記を地道にやります:
- 堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その1 関数呼び出しそれぞれに条件分岐を設ける
- 堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その2 慣習に従ったエラー処理を書く
- 堅牢なNIFの書き方: パフォーマンスの高いフォールト・トレラント・システムのためのElixirとCの併用〜その3アサーションを積極的に書く
Ports
PortだとElixirのデータとのやりとりに少し困るので,Cのプログラムで,ei.h
をインクルードして,データ構造をやりとりできるようにします.
Erl_Interface User's Guideはこちら.
次のような機能があるそうです.
- Manipulation of data represented as Erlang data types
- Conversion of data between C and Erlang formats
- Encoding and decoding of Erlang data types for transmission or storage
- Communication between C nodes and Erlang processes
- Backup and restore of C node state to and from Mnesia
Google翻訳による日本語訳はこちら
- Erlang データ型として表現されるデータの操作
- C 形式と Erlang 形式間のデータ変換
- 送信または保存のための Erlang データ型のエンコードとデコード
- C ノードと Erlang プロセス間の通信
- Mnesia との間での C ノード状態のバックアップと復元
- ElixirからCへは2通りあります.
- ElixirからPortで送って,C側で Conversion of data between C and Erlang formats (C 形式と Erlang 形式間のデータ変換)の機能を使って受け取ります.Erlangですが,サンプルプログラムはこちら: https://www.erlang.org/doc/system/erl_interface.html
- Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って,Node通信のプログラムとして作る.
- CからElixirへは次のようにします.
- Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って,Node通信のプログラムとして作る.
SpawnCoElixir + NIF
SpawnCoElixirは,Elixirをコマンド起動し,Node接続します.Nodeとのやりとりを Elixir 側で行い,NIFに渡します.
起動したElixirでNIFを起動することができます.こうすると,NIFがアボートしても,SupervisorがElixir+NIFを起動し直してくれます.
したがって,従来のNIFのコードをそのまま利用することができ,かつ,NIFがアボートしても異常終了することなく,再起動できます.
- ElixirからCへは2通りあります.
- ElixirからCへは,NIF関数の呼び出しとして実現し,所定のインタフェースを使って引数をC側で取り出します.
- Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って,Node通信のプログラムとして作る.
- CからElixirへも2通りあります.
-
enif_send
を用います.サンプルプログラムはこちら: https://github.com/zacky1972/nif_send_sample - Communication between C nodes and Erlang processes (C ノードと Erlang プロセス間の通信)機能を使って,Node通信のプログラムとして作る.
-