If fclo开发者_如何学Gose(0) is called, does this close stdin?
The reason why I'm asking this is that for some reason, stdin is being closed in my application and I cannot figure out why. I checked for fclose (stdin) and this is not in the application and so I was wondering if fclose(0) could cause undefined behaviour such as closing stdin?
If not, what are other ways that stdin could be erroneously closed?
The signature of fclose
is this:
int fclose ( FILE * stream );
That means, fclose
expects a pointer to FILE
object. So if you pass 0
, instead of a pointer, 0
would be understood as NULL
pointer1. If its NULL pointer, how do you expect it to close stdin
? It will not close. Use fclose(stdin)
, as stdin
itself is a pointer to FILE
object.
I think you're confusing stdin
with file-descriptor which is of integral type, and usually denoted as fd
. Its true that fd
of input stream is 0
. So if you want to use fd
(instead of FILE*
), then you've to use close
from <unistd.h>
.
#include <unistd.h>
int close(int fildes);
That is, close(0)
would close stdin.
1 : It seems interesting that if you had passed 1
to fclose with the intention to close stdout
, your code wouldn't even compile, and you would immediately see the problem with your code at compile-time itself. Now the question is, why would it not compile? Because unlike 0
, 1
is not implicitly converted into pointer type. The compiler would generate message like "error: invalid conversion from ‘int’ to ‘FILE*’
. See the error and line number here at ideone.
I think it will take it as fclose(NULL)
; Which should be undefined and may crash.
The following closes stdin:
close(0);
fclose(stdin);
close(STDIN_FILENO);
daemon(0, 0);
fclose(0)
invokes undefined behavior, so yes, it could do anything, including closing stdin
. But you have much bigger problems if fclose(0)
appears in your code.
精彩评论