English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
有时我们想要在Erlang运行时系统中运行一个外语程序。在这种情况下,程序被编写为一个共享库,动态链接到Erlang运行时系统。在程序员看来,链接驱动程序是一个端口程序,并且遵循与端口程序完全相同的协议。
创建链接驱动程序是与Erlang接口外语代码的最有效方法,但也是最危险的方法。链接驱动程序中的任何致命错误都会导致Erlang系统崩溃。
以下是在Erlang中实现驱动程序的示例-
-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}) final, 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) -> recibir {llamada, Llamador, Mensaje} -> Port ! {self(), {comando, encode(Mensaje)}}, recibir {Port, {datos, Data}} -> Llamador ! {ejemplo1_lid, decode(Data)} final, bucle(Port); detener -> Port ! {self(), cerrar}, recibir {Port, cerrado} -> salir(normal) end; {'EXIT', Port, Reason} -> io:format("~p ~n", [Reason]), salir(port_terminado) end. encode({doble, X}) -> [1, X]); encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int.
Tenga en cuenta que el uso de controladores es extremadamente complejo y debe ser muy cuidadoso al usarlos.