Man page - stdin(3)

Packages contains this manual

Available languages:

en fr es pl ja ru ro zh_TW zh_CN de

Manual

stdin

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
СТАНДАРТЫ
ИСТОРИЯ
ПРИМЕЧАНИЯ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

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

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