【问题标题】:Erlang: Pass a tcp socket as stdin to a UNIX processErlang:将 tcp 套接字作为标准输入传递给 UNIX 进程
【发布时间】:2014-02-13 09:15:07
【问题描述】:

我需要从 Erlang 运行 UNIX 进程,并将 TCP 套接字设置为标准输入。这可能吗?

现在我有一个从Ranch 获得的 TCP 套接字,我可以获取它的文件描述符,但我不确定如何将它设置为我正在创建的 UNIX 进程的标准输入。浏览 open_port documentation 并没有为我提供任何关于如何做到这一点的线索。

我需要这样做的原因是我正在调用的进程被硬编码以期望它的标准是一个套接字,如果不是,它就会崩溃。这意味着我不能只用open_port 打开它并将TCP 流代理给它。

我在 Ubuntu 12.04 上运行。

【问题讨论】:

  • 您考虑过创建 FIFO 吗?用os:cmd调用mkfifo,用file:open打开要写入的新文件,用os:cmd调用外部进程?不是很优雅,但应该可以解决问题。
  • 最终进程是否会将 FIFO 视为 TCP 端口?现在它断言 stdin 是 IPV4 或 IPV6 套接字。不是我会做的,但我没有该应用程序的专业知识......

标签: sockets erlang file-descriptor


【解决方案1】:

您有两个问题:能够对套接字进行 i/o 调用,并使其成为进程 standard_io 用于 i/o:

  • 每个进程都有一个组长,这是一个进程,调用中没有特定 i/o 设备的所有 i/o 请求都将发送到该进程。这可以使用 BIF erlang:group_leader/2 来设置进程的组长。派生进程时会继承组长,这就是为什么从 shell 派生的所有进程都发送与 shell 相同的输出,即使它是在另一个节点上派生的。

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

所以这基本上就是在进程/进程组和 TCP 端口之间获取 i/o 所需要做的事情。

【讨论】:

  • 感谢您的回答,但我认为在我的问题中操作系统和 Erlang 进程之间存在一些术语混淆。我试图在我的编辑中使其更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2016-04-09
  • 1970-01-01
  • 2010-11-17
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多