stdin(3)

НАИМЕНОВАНИЕ
stdin, stdout, stderr - стандартные потоки ввода/вывода

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС
#include <stdio.h>

extern FILE  *stdin;
extern FILE  *stdout;
extern FILE  *stderr;

ОПИСАНИЕ
Under normal circumstances every UNIX program has three streams opened for it when it starts up, one for input, one for output, and one for printing diagnostic or error messages. These are typically attached to the user's terminal (see tty(4)) but might instead refer to files or other devices, depending on what the parent process chose to set up. (See also the "Redirections" section of 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>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).