Throughout my years as a C programmer, I've always been confused about the standard stream file descriptors. Some places, like Wikipedia[1], say:
In the C programming language, the standard input, output, and error streams are attached to the existing Unix file descriptors 0, 1 and 2 respectively.
This is backed up by unistd.h
:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
However, this code (on any system):
write(0, "Hello, World!
", 14);
Will print Hello, World!
(and a newline) to STDOUT
. This is odd because STDOUT
's file descriptor is supposed to be 1. write
-ing to file descriptor 1
also prints to STDOUT
.
Performing an ioctl
on file descriptor 0 changes standard input[2], and on file descriptor 1 changes standard output. However, performing termios
functions on either 0 or 1 changes standard input[3][4].
I'm very confused about the behavior of file descriptors 1 and 0. Does anyone know why:
write
ing to 1 or 0 writes to standard output?
- Performing
ioctl
on 1 modifies standard output and on 0 modifies standard input, but performing tcsetattr
/tcgetattr
on either 1 or 0 works for standard input?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…