Port Drivers
Elixirから非Elixirプログラムを使いたい時の選択肢の1つ。
Cライブラリのerl_driverを使って橋渡しをするCプログラムを書く
Portsと同じようにErlangのプロセスごとのリソース
危険
Port driversがクラッシュした場合にはErlang VMごとクラッシュする
Erlang VMのschedulerがpreemptしない
ElixirからPort Driversを使う
code:ex
:ok = :erl_ddll.load("./priv", "cat") # load ./priv/cat.so
port = Port.open({:spawn_driver, "cat"}, :binary)
Port.command(port, "meow")
receive do
{^port, {:data, response}} ->
IO.inspect(response)
end
Port — Elixir v1.13.4
Port Driversを実装する
Erlang -- Port Drivers
簡単な例
Erlang -- How to Implement a Driver
libpqを使った例
Synchronous Driverの例
ErlDrvEntryのready_input, ready_outputを利用したAsynchronouse Driverの例
driver_asyncを利用したAsynchronouse Driverの例
Elixirにデータを送る場合
driver_output
erl_drv_output_term
参考
Erlang -- Ports and Port Drivers
Erlang -- Port Drivers
Erlang -- erl_driver