Erlang通过Port与C交互

2009-03-09
Erlang可以通过Port与外部C或Python程序交互,Port是一条面向字节流的通道,创建Port的进程与Port相连,从外部程序传来给 Port的数据都会由该进程接收处理。Port就像是一个Erlang的进程,你可以发送信息给Port、像进程一样注册它(register)等等,如 果外部程序崩溃掉了,一个exit信号会发送给连接着Port的进程,如果连接着Port的进程死了,外部程序也会被咔嚓掉~~Erlang、Port与 外部程序的关系如下:



Port相关命令如下:

打开端口:Port=open_port(PortName,PortSettings).

发送数据:Port ! {PidC, {command, Data}}.

转换连接进程:Port ! {PidC, {connect, Pid}}.

关闭端口:Port ! {PidC, close}.

接收数据:receive {Port,{data,Data}} -> …. end.

例如下面的代码,Erlang先打开一个端口,传送一串字符串给外部的C++程序,外部程序原样返回该字符串:

先看看外部的C++代码:
#include <iostream>
using namespace std;

int main(){
char str[128];
cin.getline(str,128);
cout << "Data receive in C : " << str << endl;
}

然后系Erlang的代码:
-module(test).
-export([start/0]).

start() ->
%打开端口并接收数据
Port=open_port({spawn,”./ctest”},[{line,1024}]),
Port!{self(),{command,“I am Oscar! 123456\n”}},
receive
{Port,{data,{eol,Msg}}} ->
io:fwrite(”Receive : ~s\n”,[Msg])
end,

%关闭端口
Port!{self(),close}.


两段代码编译后在erlang虚拟机中运行:
1> test:start().
Receive : Data receive in C : I am Oscar! 123456
{<0.31.0>,close}

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com