#include <stdio.h>
#define MAXLINE 4096
int
main(int argc, char **argv)
{
char *s;
char buf[MAXLINE];
s = fgets(buf, MAXLINE, stdin); // here, if replaced with read(0, buf, MAXLINE);
return 0;
}
Input is:12ctrl+d
fgets doesn't return until input ctrl+d again(That is: 12ctrl+dctrl+d). Why doesn't fgets return when it encounts the first EOF?
It seems 12ctrl+d doesn't work.
But when s = fgets(buf, MAXLINE, stdin); is replaced with read(0, buf, MAXLINE); read will return(input is also: 12ctrl+d).
Hitting CTRL+d on the terminal:
- simply means flush all the characters in
stdin(the input buffer) immediately- it does NOT trigger an EOF condition on
stdin
(unless the current line/buffer is co-incidentally empty.)
So hitting CTRL+D while running a program,
fgetc() will return if you do it twice consecutively.EOF condition is valid for fgetc() and it returns.fgetc() will return if you do it once on an empty-line.stdin buffer, i.e. EOF condition is valid for fgetc() and it returns.read() returns immediately as soon as the input is flushed.Checkout the answers to this question for more details.
In common implementations fgets is based on a loop around read. If you call fgets it calls read internally. Typing 12Ctrl+D makes read return the two characters "12" to fgets. That does not yet make a full line, so fgets calls read again. Since we're reading from a terminal device, and not a file for example, read waits for you to type more data. If you type Ctrl+D again, read returns 0 characters, which fgets interprets as an end of file and returns.