8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirとCのコミュニケーション方法

Last updated at Posted at 2024-05-31

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ごと異常終了することです.防ぐ方法は下記を地道にやります:

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通りあります.
8
4
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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?