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.