弗朗西斯利尼的「Erlang編程」一書提供了一個很好的和簡單 - 開始 - 與例如二郎連接到紅寶石(通過端口來實現):什麼是通過端口從Erlang調用C函數的最快和最簡單的方法?
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++進行交流?
一個關鍵的問題是你想在Erlang和C之間傳遞什麼類型的數據。只是字符串(或一般的二進制blob),整數或浮點數?或者你想發送結構化數據,比如任意的Erlang元組,到C端?那麼C代碼應該返回到Erlang--只是一個狀態碼,一個字符串,整數或浮點數,還是應該產生一些複合數據結構? – RichardC
它可以是我想從Erlang傳遞給C的整數和浮點數或元組列表(包含整數和浮點元素).C方應返回整數列表或帶有整數元素的元組列表。 – skanatek
在這種情況下,你並不需要任何庫的幫助(和開銷)。只需設計一個非常簡單的協議並來回發送原始字節。 – RichardC