【发布时间】: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