【问题标题】:How to detect that stdout is closed (when telnet session is closed) in my program?如何在我的程序中检测到标准输出已关闭(当 telnet 会话关闭时)?
【发布时间】:2013-02-20 10:28:24
【问题描述】:

我正在嵌入式 Linux 上开发程序。我的程序是一个守护进程,并且有一个日志功能,可以使用printf(stdout 输出)输出日志。

因此,如果我在嵌入式 Linux 系统上打开一个 telnet 会话,然后启动我的程序,我将在 telnet 会话中显示输出。我想知道如果我关闭 telnet 会话,输出会发生什么。输出重定向到哪里?

当我关闭 telnet 会话时,是否可以检查 stdout 是否关闭?为了避免我的日志功能在标准输出关闭时被执行。

【问题讨论】:

  • 一个守护进程根本不应该打印到标准输出......但是,您可能会遇到运行时错误。您实际上可以通过检查 printf 的返回值来确定写入的字符。试试看……见return部分。

标签: c linux stdout


【解决方案1】:

ftell 在这里可能很方便。可以检查EBADF 错误并停止任何进一步的写入。在 C 中,写入未打开的文件句柄会导致未定义的行为。

我不确定关闭您的 telnet 会话是否有问题,因为如果您使用类似 shell 的环境,环境本身可能会被杀死。我不太确定那里的行为。

【讨论】:

  • 是否可以使用if(ftell(stdout)==-1) 进行我的测试,因为ftell 返回long
  • 我尝试了ftell(stdout),但是当我的会话 telnet 仍然打开并且我还没有关闭时它返回 -1
【解决方案2】:

守护进程应该处理 SIGHUP,这是终端在关闭时生成的信号。如果你不处理它,你的守护进程将通过 telnet 终止。

如果 fd 断开连接,输出将丢失。一般来说,您应该使用 syslog() 调用来记录日志。

【讨论】:

  • 我用$ my_daemon & 启动我的守护进程,所以终端的关闭不会导致我的守护进程停止
  • 你试过了吗?也许你正在使用一个古怪的终端。末尾的“&”与 SIGHUP 无关。
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多