gpt4 book ai didi

关闭 telnet session 会将 stdout 重定向到 http 套接字

转载 作者:行者123 更新时间:2023-11-30 17:54:22 27 4
gpt4 key购买 nike

我有一个程序可以将日志输出显示到标准输出。

因此,如果我打开到目标 Linux 的 telnet session ,然后在此 telnet session 上启动我的程序,那么我将在 telnet session 上显示日志消息。

在我的程序中,我有一个正在运行的小型 http 服务器。现在,如果我更改目标 Linux 的 IP 地址,然后重新启动接口(interface)(http 服务器将自动重新启动,因为我使用 netlink 检测到 IP 地址的更改),然后我将关闭 telnet session ,并且重定向标准输出消息到我的http服务器打开的套接字,我将锁定日志消息的printf。

我尝试使用 select 来检测此锁,但没有成功:How to use select with stdout?

在进入prinf(锁定)之前select返回成功

有什么建议可以避免这个问题吗?

最佳答案

如果我理解正确的话,由于IP地址的更改,运行HTTP服务器的telnet session (为什么不使用SSH??)会被破坏。

如果程序继续向此 session (即其标准输出)写入数据,之后会发生什么:首先,随着系统缓冲数据,写入会成功,然后最终写入将被阻塞(而不是“锁定”) ”)。最后,TCP 连接将超时,写入将返回错误。 TCP session 可能会也可能不会花费很长时间才会超时,但它最终会超时。

如果您想避免阻塞(例如,如果您的应用程序是事件驱动的且不得阻塞),则可以使日志输出代码对 stdout 使用非阻塞写入。您将需要使用 fcntl 将 stdout 更改为非阻塞,并且您可能需要完全避免 stdio,因为 stdio 并非设计用于非阻塞输出。您必须实现自己的缓冲并直接写入文件描述符 1。

您还提到您希望在 stdout 日志损坏后记录到 HTTP 连接。您也可以这样做(一旦写入标准输出时发生错误就会触发),但这将需要更多工作。您必须在应用程序内部管理日志缓冲区,直到 HTTP 客户端连接并请求它。您还需要添加一项规定,以便在日志太大时丢弃日志,以防没有 HTTP 客户端连接。所有这些都超出了 SO 问题的范围......

关于关闭 telnet session 会将 stdout 重定向到 http 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14984233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com