我有一个失败的C程序,我把它缩小到一个fork()
ed孩子试图关闭stdout和stderr,它们在调用fork()
之前被其父进程关闭了 - 我假设这些流被传递给子进程。
如何在尝试使用fclose(stdout)
答案 0 :(得分:2)
UNIX上的C程序在启动时希望打开文件描述符0,1和2。如果您不希望他们去任何地方,请将/dev/null
和dup
打开到那些文件描述符。
答案 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
}
}