конечно.
отяжении всех моих лет работы программистом на Си меня всегда смущали стандартные дескрипторы потоковых файлов. Некоторые места, такие как Википедия[1], сказать:
На языке программирования C стандартные потоки ввода, вывода и ошибок присоединяются к существующим файловым дескрипторам Unix 0, 1 и 2 соответственно.
Это подтверждаетсяunistd.h
:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Тем не менее, этот код (в любой системе):
write(0, "Hello, World!\n", 14);
Будет печататьHello, World!
(и перевод строки) наSTDOUT
, Это странно, потому чтоSTDOUT
дескриптор файла должен быть равен 1.write
-для файлового дескриптора 1 также выводится наSTDOUT
.
Выполнениеioctl
по дескриптору файла 0 меняет стандартный ввод[2], а в файловом дескрипторе 1 изменяется стандартный вывод. Тем не менее, выполняяtermios
функции на 0 или 1 меняет стандартный ввод[3][4].
Я очень озадачен поведением файловых дескрипторов 1 и 0. Кто-нибудь знает почему:
write
в 1 или 0 пишет в стандартный вывод?Выполнениеioctl
на 1 изменяет стандартный вывод и на 0 изменяет стандартный ввод, но выполняяtcsetattr
/tcgetattr
на 1 или 0 работает для стандартного ввода?