Francesco Cesarini的“Erlang Programming”一书提供了一个很好的,简单易用的例子,它将Erlang连接到Ruby(通过端口实现):
module(test.erl).
compile(export_all).
test() ->
Cmd = "ruby echoFac.rb",
Port = open_port({spawn, Cmd}, [{packet, 4}, use_stdio, exit_status, binary]),
Payload = term_to_binary({fac, list_to_binary(integer_to_list(23))}),
port_command(Port, Payload),
receive
{Port, {data, Data}} ->
{result, Text} = binary_to_term(Data),
Blah = binary_to_list(Text),
io:format("~p~n", [Blah])
end.
但是,本例中使用的Ruby代码使用Erlictricity库,它为程序员执行所有低级操作:
require 'rubygems'
require 'erlectricity'
require 'stringio'
def fac n
if (n<=0) then 1 else n*(fac (n-1)) end
end
receive do |f|
f.when(:fac, String) do |text|
n = text.to_i
f.send!(:result, "#{n}!=#{(fac n)}")
f.receive_loop
end
end
我尝试使用这个稍微修改过的test.erl代码:
test(Param) ->
Cmd = "./add",
Port = open_port({spawn, Cmd}, [{packet, 4}, use_stdio, exit_status, binary]),
Payload = term_to_binary({main, list_to_binary(integer_to_list(Param))}),
...
用一个非常简单的C文件说话:
/* add.c */
#include <stdio.h>
int main(int x) {
// return x+1;
printf("%i\n",x+1);
}
但不幸的是,test.erl中的接收循环收到消息{#Port<0.2028>,{exit_status,2}}
我的问题是:是否有可能在C / C ++中实现类似的东西? 是否有任何现成的库可供Erlang通过类似于Erlictricity for Ruby的端口与C / C ++交谈?
答案 0 :(得分:1)
首先阅读Erlang / OTP在线文档中的互操作性教程:http://erlang.org/doc/tutorial/users_guide.html。当与C程序通信时,您只需编写C代码以从stdin读取并写入stdout,这将连接到Erlang端口。您还可以阅读http://manning.com/logan中的第12章。
答案 1 :(得分:-1)
您是否在此处结帐Erl Interface
: http://www.erlang.org/doc/tutorial/erl_interface.html
?
我发现的其他有趣链接如下:
http://www.erlang.org/documentation/doc-4.9.1/pdf/erl_interface-3.2.pdf 的
http://www.erlang.org/doc/apps/erl_interface/index.html 的
http://dukesoferl.blogspot.com/2010/01/minor-erlang-interface-tricks.html
我希望有人帮助:)