stdin(3)

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

БИБЛИОТЕКА
Standard C library (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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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