Erlang - Sürücüler

Bazen Erlang Runtime System içinde bir yabancı dil programı çalıştırmak istiyoruz. Bu durumda program, Erlang çalışma zamanı sistemine dinamik olarak bağlanan paylaşılan bir kitaplık olarak yazılır. Bağlantılı sürücü, programlayıcıya bir bağlantı noktası programı olarak görünür ve bir bağlantı noktası programıyla tamamen aynı protokole uyar.

Sürücü Oluşturma

Bağlantılı bir sürücü oluşturmak, yabancı dil kodunu Erlang ile arabirim oluşturmanın en etkili yoludur, ancak aynı zamanda en tehlikelidir. Bağlantılı sürücüdeki herhangi bir ölümcül hata Erlang Sistemini çökertecektir.

Aşağıda, Erlang'da bir sürücü uygulamasına bir örnek verilmiştir -

Misal

-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.

Sürücülerle çalışmanın son derece karmaşık olduğunu ve sürücülerle çalışırken dikkatli olunması gerektiğini lütfen unutmayın.