如何在调用fclose()之前判断流是否在C中关闭

时间:2010-03-03 07:54:19

标签: c++ c stream

我有一个失败的C程序,我把它缩小到一个fork() ed孩子试图关闭stdout和stderr,它们在调用fork()之前被其父进程关闭了 - 我假设这些流被传递给子进程。

如何在尝试使用fclose(stdout)

之类的内容关闭流之前判断流是否已关闭

4 个答案:

答案 0 :(得分:2)

UNIX上的C程序在启动时希望打开文件描述符0,1和2。如果您不希望他们去任何地方,请将/dev/nulldup打开到那些文件描述符。

答案 1 :(得分:0)

如果您在该级别工作,您可能不应该使用C标准库的缓冲FILE指针(stdin& co),而是使用基础{{3}整数本身。

您应该可以执行一些无害的操作,例如文件上的file descriptor可以检测基础描述符是否有效。

答案 2 :(得分:0)

您可以使用ftell()来检查。 如果它返回-1,则您的流大部分都将关闭。

答案 3 :(得分:0)

  

调用fclose()后,任何使用   流导致未定义的行为。

因此,如果它是FILE *标准输出,则根本不能再使用stdout,甚至不能检查它是否有效/开放。

你可以直接使用stdout的文件描述符,它是fd 1。

struct stat stbuf;
if(fstat(1,&stbuf) == -1) {
  if(errno == EBADF) {
    stdout isn't open/valid
  }
}