English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ErlangTreiber

Manchmal möchten wir eine Fremdsprache in einem Erlang-Run-time-System ausführen. In diesem Fall wird das Programm als Shared Library geschrieben und dynamisch in das Erlang-Run-time-System gelinkt. Für den Programmierer ist der verknüpfte Treiber ein Port-Programm und folgt denselben Protokollen wie Port-Programme.

Treiber erstellen

Die Erstellung eines verknüpften Treibers ist die effektivste, aber auch gefährlichste Methode, um Fremdsprachencode mit dem Erlang-Interface zu verbinden. Jeder tödliche Fehler im verknüpften Treiber führt zu einem Absturz des Erlang-Systems.

Hier ist ein Beispiel für die Implementierung eines Treibers in Erlang-

Beispiel

-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 
   {aufruf, Rufender, Nachricht} -> 
   Port ! {self(), {befehl, encode(Nachricht)}}, receive 
   {Port, {daten, Daten}} ->
   Rufender ! {Beispiel1_lid, decode(Daten)} 
   end, 
loop(Port); 
stop -> Port ! 
   {self(), close}, 
   receive 
      {Port, geschlossen} -> 
      exit(normal) 
   end; 
   
      {'EXIT', Port, Grund} -> 
      io:format("~p ~n" , [Grund]), 
      exit(port_terminated) 
   end. 
encode({doppelt, X}) -> [1, X]; 
encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int.

Bitte beachten Sie, dass die Verwendung von Treibern sehr komplex ist und besondere Vorsicht bei der Verwendung von Treibern geboten ist.