Provided by: manpages-ru-dev_4.27.0-1_all 

НАИМЕНОВАНИЕ
stdin, stdout, stderr - стандартные потоки ввода/вывода
БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)
ОБЗОР
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
ОПИСАНИЕ
В обычном состоянии каждая программа UNIX после запуска имеет при открытых потока, один для ввода данных,
один для вывода и один для печати диагностических сообщений или ошибок. Обычно, они присоединены к
терминалу пользователя (смотрите tty(4)), но также они могут ссылаться на файлы или другие устройства, в
зависимости от того, как это настроил родительский процесс (также смотрите раздел «Перенаправление
(redirection)» в sh(1)).
Входной поток называют «стандартным вводом»; выходной поток называют «стандартным выводом»; поток ошибок
называют «стандартным потоком ошибок». Эти термины в сокращённой форме (символы stdin, stdout и stderr)
используются для обращения к соответствующим файлам.
Каждый из этих символов является макросом stdio(3) с типом указателя на FILE и может быть использован в
функциях вроде fprintf(3) или fread(3).
Так как FILE — буферная обёртка вокруг файловых дескрипторов UNIX, файлы, на которые она ссылается, могут
быть доступны через обычный низкоуровневый файловый интерфейс UNIX, то есть через функции read(2) и
lseek(2).
При запуске программы с потоками stdin, stdout и stderr связываются целочисленные файловые дескрипторы 0,
1 и 2, соответственно. Для этих значений в <unistd.h> определены препроцессорные символы STDIN_FILENO,
STDOUT_FILENO и STDERR_FILENO (с помощью freopen(3) у любого из этих потоков можно изменить номер
файлового дескриптора, связанного с потоком).
Заметим, что одновременное использование FILE и низкоуровневых файловых дескрипторов может привести к
непредсказуемым результатам и этого нужно избегать (для мазохистов: в POSIX.1, раздел 8.2.3, подробно
описано как должно работать такое взаимодействие). Общее правило: файловые дескрипторы обрабатываются в
ядре, а stdio всего лишь библиотека. Это означает, что, например, после exec(3) потомок наследует все
открытые файловые дескрипторы, но все старые потоки становятся недоступными.
Так как символы stdin, stdout и stderr определены как макросы, присвоение им значения непереносимо.
Стандартные потоки можно связать с различными файлами с помощью библиотечной функции freopen(3),
специально созданной для переназначения stdin, stdout и stderr. Стандартные потоки закрываются вызовом
exit(3) и при нормально завершении программы.
СТАНДАРТЫ
C11, POSIX.1-2008.
The standards also stipulate that these three streams shall be open at program startup.
ИСТОРИЯ
C89, POSIX.1-2001.
ПРИМЕЧАНИЯ
Поток stderr является небуферизованным. Поток stdout буферизируется построчно, если подключён к
терминалу. Часть строки не появляется до тех пор, пока не будет вызвана функция fflush(3) или exit(3),
или не появится символ новой строки. Это может приводить к неожиданным результатам, особенно при выводе
диагностических сообщений. Режим буферизации стандартных потоков (или любого другого потока) модно
изменить с помощью вызова setbuf(3) или setvbuf(3). Заметим, что в случае когда stdin связан с
терминалом, также может быть буферизация ввода в драйвере терминала, никак не связанная с буферизацией
stdio (более того, обычный терминальный ввод буферизируется построчно в ядре). Работу ядра по обработке
ввода можно изменить с помощью вызова tcsetattr(3) и подобным; также смотрите stty(1) и termios(3).
СМОТРИТЕ ТАКЖЕ
csh(1), sh(1), open(2), fopen(3), stdio(3)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat
Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras
<sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов
<pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 2 мая 2024 г. stdin(3)