I am writing a program which currently gets continuous input from stdin and does something with it until stdin is closed.
fgets(buffer, BUFFERSIZE, stdin);
while(fcntl(fileno(stdin), F_GETFD) != -1 || errno != EBADF){
/*
some code
*/
fgets(buffer, BUFFERSIZE, stdin);
}
Currently to test out if this is a valid way of checking if stdin is closed the
some code
is set to just print buffer continuously. However when I try to close stdin with Ctrl +D the program keeps printing whatever it had in buffer indefinitely. Why is that?
There is no portable way to detect that a
FILE *has been closed, even for predefined streams such asstdin,stdoutorstderr. Testing the system handlefileno(stdin)is not portable and accessing the handle of a stream has undefined behavior if the stream has been closed withfclose().You seem to make a confusion between closing a stream, which is performed by
fclose(), and reaching the end of file, which is detected by testing the return value offgets()and other functions reading from a stream.Here is a modified version: