Erlang - Pilotes

Parfois, nous voulons exécuter un programme en langue étrangère dans le système d'exécution Erlang. Dans ce cas, le programme est écrit en tant que bibliothèque partagée qui est liée dynamiquement au système d'exécution Erlang. Le pilote lié apparaît au programmeur comme un programme de port et obéit exactement au même protocole que pour un programme de port.

Créer un pilote

La création d'un pilote lié est le moyen le plus efficace d'interfacer du code en langue étrangère avec Erlang, mais c'est aussi le plus dangereux. Toute erreur fatale dans le pilote lié fera planter le système Erlang.

Voici un exemple d'implémentation de pilote dans Erlang -

Exemple

-module(helloworld). 
-export([start/0, stop/0]). 
-export([twice/1, sum/2]). 

start() ->
   start("example1_drv" ). 
start(SharedLib) ->
   case erl_ddll:load_driver("." , SharedLib) of 
   ok -> ok; 
      {error, already_loaded} -> ok; 
      _ -> exit({error, could_not_load_driver}) 
   end, 
   
   spawn(fun() -> init(SharedLib) end). 

init(SharedLib) -> 
   register(example1_lid, self()), 
   Port = open_port({spawn, SharedLib}, []), 
   loop(Port). 

stop() -> 
   example1_lid ! stop. 

twice(X) -> call_port({twice, X}). 
sum(X,Y) -> call_port({sum, X, Y}). call_port(Msg) -> 
   example1_lid ! {call, self(), Msg}, receive 
      {example1_lid, Result} -> 
      Result 
   end. 

LINKED-IN DRIVERS 223 
loop(Port) -> 
receive 
   {call, Caller, Msg} -> 
   Port ! {self(), {command, encode(Msg)}}, receive 
   {Port, {data, Data}} ->
   Caller ! {example1_lid, decode(Data)} 
   end, 

loop(Port); 
stop -> Port ! 
   {self(), close}, 
   receive 
      {Port, closed} -> 
      exit(normal) 
   end; 
   
      {'EXIT', Port, Reason} -> 
      io:format("~p ~n" , [Reason]), 
      exit(port_terminated) 
   end. 

encode({twice, X}) -> [1, X]; 
encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int.

Veuillez noter que travailler avec des pilotes est extrêmement complexe et que des précautions doivent être prises lorsque vous travaillez avec des pilotes.