如果想把erlang和一个C的程序对接起来,那么就需要用到接口技术。
我们需要在一个独立的操作系统进程里运行一个与erlang运行时系统相互独立的外部程序。Erlang 的运行时系统通过二进制的通信通道与这个外部程序交互。在erlang端有一个erlang端口负责管理这样的通信,我们把创建这种端口的进程称为端口连接进程。
Port=open_port(PortName,PortSettings) //返回一个端口
如下消息是会被发送到端口(这些消息中PidC是连接进程的PID):
Port ! {PidC,{command,Data}} :发送数据到端口
Port ! {PidC,{connect,Pid1}} :改变控制进程的PID,从PidC到Pid1
Port ! {PidC,close} :关闭端口
连接进程会从扩展程序收到如下消息:
receive
{Port,{data,Data}} ->
... 数据处理 ...
open_port(PortName,[Opt]) -> Port
PortName是如下之一:
{spawn,Command}启动一个扩展程序。Command是扩展程序的名字。Command会在Erlang的工作空间以外工作,除非找到了叫做Command的内联驱动。
{fd,In,Out}允许Erlang进程存取一个已经打开的文件描述符。文件描述符 “In” 用作stdin,而文件描述符 “Out” 用作stdout。
Opt是如下之一:
{packet,N}包前面加上N(1,2,4)字节长度的长度包头。
stream消息不是按照包长度发送的。应用自己知道如何处理这些包。
{line,Max}以行为单位传递消息。如果一行大于Max字节,则会切割为只有Max字节。
{cd,Dir}仅用于 {spawn,Command} 选项,扩展程序的初始目录为Dir。
{env,Env}仅用于 {spawn,Command} 选项。指定扩展程序可用的环境变量为Env。Env是一个列表的 {VarName,Value} 对。两个变量都是字符串。
分享到:
评论