【问题标题】:Asserting stdin is open断言标准输入已打开
【发布时间】:2011-12-09 15:41:59
【问题描述】:

我在 C 中具有假定标准输入已打开的函数。我想在它前面添加一个断言,以确保 stdin 没有被任何人关闭。如何检查 stdin 没有被任何人关闭?

assert(is_open(stdin));

【问题讨论】:

  • 你为什么要关心这个 - 是什么让你认为你的代码中的其他东西愚蠢到足以关闭标准输入?
  • @JonathanLeffler 我在一家公司工作。可以编写一个函数 A() 在文件完成时打开和关闭文件。其他一些程序员可以将 STDIN 作为参数传递。如果我的函数在 A() 函数之后调用,它将找不到 STDIN。这就是为什么。
  • @DanParadox:那么你的同事应该采用这样的原则:一个函数应该关闭一个FILE*,当且仅当它打开它。
  • 函数 A() 不能通过标准输入,因为它在函数启动之前是打开的。

标签: c stdin stdio


【解决方案1】:

您无法查明FILE* 是否已关闭。 fclose 可能是 free 它指向的 FILE 对象,因此在 fclose 之后对象的内容可能是未定义的。即使stdin 也是如此。我之前提出的解决方案是错误的。对此感到抱歉。

您可以在 POSIX 平台上做的最好的事情是这样的

bool stdin_open()
{
    errno = 0;
    fcntl(STDIN_FILENO, F_GETFD);
    return errno == EBADF;
}

虽然这确实告诉您一些关于标准输入 FD 的信息,而不是 stdin 对象。

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多