Какой самый быстрый и простой способ вызвать функцию C из Erlang через порты? - PullRequest
3 голосов
/ 07 октября 2011

Книга Франческо Чезарини "Программирование на Erlang" предоставляет хороший и простой для начала пример подключения 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 для общения с C / C ++ через порты, аналогичные Erlictricity для Ruby?

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Начните с чтения Учебника по взаимодействию в онлайн-документации Erlang / OTP: http://erlang.org/doc/tutorial/users_guide.html. При общении с программой на C вы просто пишете код на C для чтения из stdin и записи в stdout, и это будет подключенодо порта Эрланг.Вы также можете прочитать главу 12 в http://manning.com/logan.

0 голосов
/ 08 октября 2011

Вы уже зарегистрировались Erl Interface здесь: <a href="http://www.erlang.org/doc/tutorial/erl_interface.html" rel="nofollow">http://www.erlang.org/doc/tutorial/erl_interface.html</a>?
Другие интересные ссылки, которые я нашел, перечислены ниже:

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

Я надеюсь, что это поможет :)

...