Erlang 驱动程序

有时我们想要在 Erlang 运行时系统中运行一个外语程序。在这种情况下,程序被编写为一个共享库,动态链接到 Erlang 运行时系统。在程序员看来,链接驱动程序是一个端口程序,并且遵循与端口程序完全相同的协议。

创建驱动程序

创建链接驱动程序是与 Erlang 接口外语代码的最有效方法,但也是最危险的方法。链接驱动程序中的任何致命错误都会导致 Erlang 系统崩溃。

以下是在Erlang中实现驱动程序的示例-

实例

-module(helloworld).-export([start/0,stop/0]).-export([twice/1,sum/2]).start()->start("example1_drv").start(SharedLib)->caseerl_ddll:load_driver(".",SharedLib)ofok->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}->Resultend.LINKED-INDRIVERS223loop(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.

请注意,使用驱动程序极为复杂,在使用驱动程序时应格外小心。

编辑于2024-05-20 15:23