【问题标题】:If fclose(0) is called, does this close stdin?如果调用 fclose(0),这会关闭标准输入吗?
【发布时间】:2011-05-10 14:35:35
【问题描述】:

如果 fclose(0) 被调用,这会关闭标准输入吗?

我问这个的原因是由于某种原因,stdin 在我的应用程序中被关闭,我不知道为什么。我检查了 fclose (stdin) 并且它不在应用程序中,所以我想知道 fclose(0) 是否会导致未定义的行为,例如关闭标准输入?

如果不是,stdin 可能被错误关闭的其他方式有哪些?

【问题讨论】:

  • fileno( stdin ) == 0,但是 stdin != 0
  • 您要求错误方法来关闭标准输入?那么我想我们大多数人现在都在这样做:-?
  • 您确定它是在in您的应用程序中关闭,而不是在您的应用程序之前关闭吗? stdin 是否在您的程序一次运行开始时正常工作,然后在运行中间停止工作?如果没有,也许调用你的程序关闭(或从未设置)标准输入。

标签: c++ c posix stdin


【解决方案1】:

fclose的签名是这样的:

int fclose ( FILE * stream );

这意味着,fclose 需要一个指向 FILE 对象的指针。所以如果你传递0,而不是指针,0 将被理解为NULL 指针1。如果它的 NULL 指针,你希望它如何关闭stdin?它不会关闭。使用fclose(stdin),因为stdin 本身就是一个指向FILE 对象的指针。

我认为您将stdin 与整数类型的文件描述符混淆了,通常表示为fd。输入流的fd 确实是0。因此,如果您想使用fd(而不是FILE*),那么您必须使用<unistd.h> 中的close

#include <unistd.h>
int close(int fildes);

也就是说,close(0) 将关闭标准输入。

1 :有趣的是,如果您将 1 传递给 fclose 并打算关闭 stdout,您的代码甚至不会编译,并且您会立即在编译时看到代码本身的问题。现在的问题是,为什么它不能编译?因为与0 不同,1 不会隐式转换为指针类型。编译器会生成类似"error: invalid conversion from ‘int’ to ‘FILE*’ 的消息。查看错误和行号here at ideone

【讨论】:

  • @Nawaz 但是使用fclose(stdin) 安全吗?它会产生任何未定义的行为吗?如题,和打电话close(0)有什么不同吗?
  • @Djack: 1) 是的。 2) 没有。 3) 没有。
【解决方案2】:

我认为它会作为fclose(NULL);哪个应该是未定义的并且可能会崩溃。

【讨论】:

  • 有时定义为崩溃 :) 来自 Mac OS X 手册页: fclose() 函数不处理 NULL 参数;它们将导致分段违规
【解决方案3】:

以下关闭标准输入: close(0); fclose(stdin); close(STDIN_FILENO); daemon(0, 0);

【讨论】:

    【解决方案4】:

    fclose(0) 调用 未定义的行为,所以是的,它可以做任何事情,包括关闭 stdin。但是如果fclose(0) 出现在您的代码中,您的问题就会大得多。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多