Erlang :
send_integer(Int) ->
Size = erlang:system_info(wordsize) * 8,
Data = <<Int:Size/integer-little>>,
Port ! {self(), {command, Data}},
....
CPP :
static void output(ErlDrvData handle, char* buff, int bufflen){
int *num = (int *)buff
....
erlang 与 linked-in driver 间的通信
2009-05-31
| 張貼者:
M-OSCAR
erlang貌似没有直接向port写入整数的方法,通过port传送的全是binary数据,以下代码在erlang中通过port传送一个整数给cpp读取~~
Posted In
cpp,
erlang,
port
|
0
意見
|
Erlang Linked in driver
2009-05-24
| 張貼者:
M-OSCAR
Erlang允许其他语言编写的程序以共享库的方式动态连接到Erlang运行时环境里运行,与Erlang Port的方式相似,这种方式称为linked-in driver(内部连接驱动??),是Erlang与其他语言程序交互的最高效的方式,但同时也是最危险的,因为一旦驱动内部出现致命异常,Erlang虚拟机也会崩溃,拖累其他Erlang进程一起挂掉,因此如非必要不推荐使用linked-in driver。
下面是C++编写的driver,具体代码结构解析请参见《Programming Erlang》
g++ test.cpp -I/usr/local/lib/erlang/usr/include/ -fPIC -shared -o test.so
Erlang里调用这个共享库的代码如下:
下面是C++编写的driver,具体代码结构解析请参见《Programming Erlang》
#include然后用如下命令编译成共享库:#include "erl_driver.h" using namespace std; struct data{ ErlDrvPort port; }; //PORT打开时执行 static ErlDrvData start(ErlDrvPort port, char *buff){ data* d = (data*)driver_alloc(sizeof(data)); d->port = port; return (ErlDrvData)d; } //PORT关闭时执行 static void stop(ErlDrvData handle){ driver_free((char*)handle); } //ERLANG发送来信息时执行 static void output(ErlDrvData handle, char *buff, int bufflen){ cout << buff << endl; char rs[] = "ok"; data* d = (data*)handle; driver_output(d->port, rs, 2); } ErlDrvEntry driver_entry = { NULL, //F_PTR init N/A start, //L_PTR PORT打开时执行此函数 stop, //F_PTR PORT关闭时执行此函数 output, //F_PTR ERLANG发来信息时执行 NULL, //F_PTR ready_input, called when input descriptor ready to read NULL, //F_PTR ready_output "test", //DRIVER名,OPEN_PORT函数的参数 NULL, //F_PTR finish, called when unloaded NULL, //F_PTR control, port_command callback NULL, //F_PTR timeout, reserved NULL //F_PTR outputv, reserved }; extern "C"{ DRIVER_INIT(test){ return &driver_entry; } }
g++ test.cpp -I/usr/local/lib/erlang/usr/include/ -fPIC -shared -o test.so
Erlang里调用这个共享库的代码如下:
-module(test).
-compile(export_all).
start() ->
ok = erl_ddll:load_driver(".", "test"),
Port = open_port({spawn, "test"}, [{packet, 2}]),
Port ! {self(), {command, "woo just a test"}},
receive
{Port, {data, Data}} ->
ok = io:format("[~p/~p] ~p\n", [?MODULE, self(), Data])
end,
Port ! {self(), close}.
Posted In
c++,
erlang,
port
|
0
意見
|
Erlang通过Port与C交互
2009-03-09
| 張貼者:
M-OSCAR
Erlang可以通过Port与外部C或Python程序交互,Port是一条面向字节流的通道,创建Port的进程与Port相连,从外部程序传来给 Port的数据都会由该进程接收处理。Port就像是一个Erlang的进程,你可以发送信息给Port、像进程一样注册它(register)等等,如 果外部程序崩溃掉了,一个exit信号会发送给连接着Port的进程,如果连接着Port的进程死了,外部程序也会被咔嚓掉~~Erlang、Port与 外部程序的关系如下:

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

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}
Posted In
c,
erlang,
port
|
0
意見
|
訂閱:
文章 (Atom)