bbazso
bbazso

Reputation: 2049

If fclose(0) is called, does this close stdin?

If fclose(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?

Upvotes: 13

Views: 19127

Answers (4)

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215387

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.

Upvotes: 7

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361612

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.

Upvotes: 22

Mel
Mel

Reputation: 6167

The following closes stdin: close(0); fclose(stdin); close(STDIN_FILENO); daemon(0, 0);

Upvotes: 6

Mayank
Mayank

Reputation: 5728

I think it will take it as fclose(NULL); Which should be undefined and may crash.

Upvotes: 6

Related Questions