2011-10-07 36 views
2

弗朗西斯利尼的「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++進行交流?

+0

一個關鍵的問題是你想在Erlang和C之間傳遞什麼類型的數據。只是字符串(或一般的二進制blob),整數或浮點數?或者你想發送結構化數據,比如任意的Erlang元組,到C端?那麼C代碼應該返回到Erlang--只是一個狀態碼,一個字符串,整數或浮點數,還是應該產生一些複合數據結構? – RichardC

+0

它可以是我想從Erlang傳遞給C的整數和浮點數或元組列表(包含整數和浮點元素).C方應返回整數列表或帶有整數元素的元組列表。 – skanatek

+0

在這種情況下,你並不需要任何庫的幫助(和開銷)。只需設計一個非常簡單的協議並來回發送原始字節。 – RichardC

回答

-1
+0

我已經讀過它,我不得不承認我無法使這個例子工作(另一方面Ruby例子更簡單)。如果這是唯一的選擇,那麼我必須花更多的時間:) – skanatek

相關問題