2014-01-23 33 views
0

我需要从Erlang运行UNIX进程,并将TCP套接字设置为标准输入。那可能吗?Erlang:将tcp套接字作为标准输入传递给UNIX进程

现在我有一个TCP套接字,我从Ranch得到了,我可以得到它的文件描述符,但我不确定如何将它设置为我创建的UNIX进程的标准输入。透过open_portdocumentation没有提供任何线索如何做到这一点。

我需要这样做的原因是我调用的过程是硬编码的,希望它的标准是一个套接字,如果不是,它会崩溃。这意味着我不能用open_port打开它,并将TCP流代理到它。

我在Ubuntu 12.04上运行。

+0

您是否考虑过创建FIFO?用os:cmd调用mkfifo,打开新文件用file:open打开,用os:cmd来调用外部进程?没有远程优雅,但应该做的伎俩。 – macintux

+0

最终进程是否将FIFO看作TCP端口?现在它声明stdin是一个IPV4或IPV6套接字。不是我会做的,但我没有在该应用程序的专业知识...... – kjw0188

回答

0

你有两个问题:能够I/O调用到插座,并使其过程standard_io用于I/O:

  • 每一个过程都有组长这是一个过程所有在呼叫中没有特定I/O设备的I/O请求都被发送到该服务器。这可以使用BIF erlang:group_leader/2来设置流程的组长。当一个进程产生时,组长会被继承,这就是为什么从shell产生的所有进程都会将其输出与shell相同的输出,即使它在另一个节点上产生。

  • 接下来的问题是修复它,以便您可以在您的TCP套接字上执行Erlang I/O请求,例如io:format。 Erlang中的所有I/O都必须通过一个实现Erlang i/o protocol的I/O服务器。它是处理来自Erlang代码的I/O请求并将它们转换为从外部发送/接收数据的I/O服务器。我已经在GitHub上实现了TCP i/o server。没有任何文档,但在底部有一些例子,例如打开一个监听套接字的例子,并且为每个新连接启动一个通过该套接字处理I/O的shell。这实际上是非常短的代码。

所以这基本上是你需要做的,以获得进程/进程组和TCP端口之间的I/O。

+0

感谢您的回答,但我认为在我的问题中,操作系统和Erlang过程之间存在一些术语混淆。我试图在编辑时更加清晰。 – kjw0188

相关问题