【问题标题】:How do I connect Erlang to C++?如何将 Erlang 连接到 C++?
【发布时间】:2011-12-16 23:07:57
【问题描述】:

我写了一段非常简单的 C++ 代码:

#include <iostream>
using namespace std;

int main() {

int message;

cin >> message;
cout << message;
return 0;
}

我已经在 shell 中对其进行了测试 - 它返回一个在 shell 中输入的值。

但是当我尝试从 Erlang 调用它时,它返回 {exit_status,0},据我了解,这意味着它只是 exited

Erlang 代码在这里:

p(Param) ->
    ?DBG("Starting~n", []),
    Cmd = "./Echo\n",
    Port = open_port({spawn,Cmd}, [binary,{packet, 4},  exit_status]),
    Payload = term_to_binary(list_to_binary(integer_to_list(Param))),
    ?DBG("Opened the port: ~w~n", [Port]),
    erlang:port_command(Port, Payload),
    ?DBG("Sent command to port: ~w~n", [Payload]),
    ?DBG("Ready to receive results for command: ~w~n", [Payload]),
    receive
        {Port, {data, Data}} ->
            ?DBG("Received data: ~w~n", [Data]),
            {result, Text} = binary_to_term(Data),
            Blah = binary_to_list(Text),
            io:format("~p~n", [Blah]);
        Other ->
            io:format("Unexpected data: ~p~n", [Other])

    end.

如何将我的 Erlang 端口连接到这个简单的 C++ 代码?

更新:

将 C++ 代码更改为这个(无用的版本):

#include <iostream>
using namespace std;

int main() {

int message;

cin.read(reinterpret_cast<char *>(&message), 4);
cout.write(reinterpret_cast<char *>(&message), 4);
return 0;
}

Erlang 端口进程仍然获得 {exit_value,0}。如果我在 shell 中运行此代码,则在按两次 Return 之前不会回显键盘输入。

【问题讨论】:

  • 您的问题与 C++ 无关。您正在寻找的只是如何连接衍生进程的标准 I/O 文件。
  • 您能详细说明一下吗?谢谢!
  • 但是使用第二种形式,您正在等待来自终端的 4 个字节,例如。也许\n\r 两次。我强烈建议放弃 Erlang 和 C++ 端的二进制协议,只使用文本,除非你有明确的性能要求。
  • 对不起,我忘了提 - 性能是我的要求之一。但是,我不知道使用文本是否会引入开销:我需要将大约 30MB 的数据从 Erlang 传递到 C++,并将几 KB 的数据从 C++ 传递回 Erlang。因此,对于这些数据量,性能可能不是问题。你能帮我只发短信吗?
  • 如果是 30MB 的二进制文件,那么格式化为文本可能会有点大。那么,坚持使用二进制:您能否为 C++ 代码编写一个 Erlang 替代品,并在担心两种语言之前专注于让您的 I/O 正常工作?

标签: c++ interop erlang erlang-ports


【解决方案1】:

您知道提取运算符cin &gt;&gt; 需要格式化输入,对吧? 也就是说,它会提取一个表示整数的字符串,但可能无法很好地处理 4 字节二进制整数或 Erlang 发送的任何内容。

如果要读取二进制数据,请使用

cin.read(reinterpret_cast<char *>(&message), 4);
cout.write(reinterpret_cast<char *>(&message), 4);

例如。 或者,当然,在 Erlang 端编写和接收文本。

【讨论】:

  • 对不起,我忘了添加免责声明:我是 C++ 初学者。我更改了“cin >> 消息;”与您提供的行对应,但我仍然收到 {exit_status,0}
  • 输出端呢?底线是,流的插入和提取运算符重载通常用于格式化文本,而不是二进制数据。我也会把输出端放在我的答案中......
  • 谢谢!我已经用新代码更新了这个问题。很抱歉成为这样的 C++ 新手——我只能通过 Java 经验编写非常简单的 C++ 程序。
【解决方案2】:

使用 {packet, 4} Erlang 添加并期望以下二进制文件的附加信息。而且, term_to_binary/1 将整数编码为BERT 格式(一种二进制格式,如thrift)。为了简单的测试,您应该使用带有解析的文本协议:

不是:Payload = term_to_binary(list_to_binary(integer_to_list(Param))),

但是:Payload = &lt;&lt;"hello, C++"&gt;&gt;,

【讨论】:

    【解决方案3】:

    be IPC 可能是一个可接受的解决方法? ZeroC 具有出色的 C++ 支持,而且看起来 decent Erlang support 也是如此。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多