代码之家  ›  专栏  ›  技术社区  ›  Greg Rogers

stdin上的close/fclose是否保证正确?

  •  5
  • Greg Rogers  · 技术社区  · 17 年前

    似乎以下调用实现了您所期望的功能(关闭流,不允许任何进一步的输入-流上等待输入的任何内容都会返回错误),但它是否保证在所有编译器/平台上都是正确的?

    close(fileno(stdin));
    fclose(stdin);
    
    3 回复  |  直到 17 年前
        1
  •  27
  •   R.. GitHub STOP HELPING ICE    15 年前

    fclose(stdin) 导致进一步使用 stdin 非常糟糕的事情

    close(fileno(stdin)) 导致任何来自的输入的进一步尝试 标准 EBADF ,但仅在打开另一个文件之前,在这种情况下,该文件将变为fd#0,并且 坏事会发生的 .

    int fd = open("/dev/null", O_WRONLY);
    dup2(fd, 0);
    close(fd);
    

    添加了一些错误检查。这将确保所有读取(在当前缓冲区耗尽后)都会导致错误。如果您只是希望它们导致EOF,而不是错误,请使用 O_RDONLY O_WRONLY .

        2
  •  14
  •   Sniggerfardimungus    17 年前

    不要关闭文件号(文件*)。文件是一个缓冲对象。研究它的实现并干预它的状态会带来所有的警告和危险,这些警告和危险会在任何其他软件模块上出现类似的错误行为。

    啊。认真地肮脏的

        3
  •  3
  •   Jason Coco superfell    17 年前

    在所有可能的操作系统中都不能保证正确。然而,调用fclose(stdin)可以在任何兼容POSIX的操作系统以及Windows操作系统上运行,因此您现在应该可以访问几乎所有通用的操作系统。

    正如前面的回答和我的评论所述,没有必要在文件句柄上调用close。fclose()将为您正确关闭所有内容。

    推荐文章