【问题标题】:How does (x)inetd "split" its connected socket into STDIN/STDOUT/STDERR?(x)inetd 如何将其连接的套接字“拆分”为 STDIN/STDOUT/STDERR?
【发布时间】:2025-11-28 22:50:01
【问题描述】:

我认为 (x)inetd 像大多数守护进程一样工作,因为当它accept()s 在它正在监视的端口上建立一个连接时,就会创建一个套接字。不过,不知何故,在它fork()s 和exec()s 成为目标服务程序之前,它设法将此双向套接字转换为三个标准 I/O 描述符 STDIN、STDOUT 和 STDERR。

我一直在询问如何在不滚动我自己的inetd 版本的情况下克服这种行为,但没有成功。我突然想到以这种方式提出这个问题,因为它可能会为我如何将文件描述符 0、1 和 2 重新“加入”到单个套接字中提供线索。

我希望服务程序通过单个套接字进行双向通信的原因是它需要使用基于单个双向套接字的 I/O 基础架构。

【问题讨论】:

  • 您如何确定 fds 0、1 和 2 不都只是指同一个底层套接字?
  • 嗯......我不是。但是不可能选择一个并双向使用它——例如,写入 STDIN 会引发错误;我认为描述符已关闭以供写入。
  • 嗯。不知道那里发生了什么,我还没有真正研究过需要在inetd下运行的代码。但与所有的 unix 一样,发生的事情可能比你想象的要简单。 :)

标签: sockets stdout stdin inetd xinetd


【解决方案1】:

inet.d 服务器的传入数据将被映射到 stdin,并且 fprintf(stdout) & fprintf(stderr )inet.d 处理程序将通过合并为一个流发送回客户端。

这里的问题是 telnet 客户端无法区分 stdout 和 stderr 流。如果需要,请使用 ssh 而不是 telnet,这提供了选项。

【讨论】: