.\" -*- coding: UTF-8 -*- .\" From dholland@burgundy.eecs.harvard.edu Tue Mar 24 18:08:15 1998 .\" .\" This man page was written in 1998 by David A. Holland .\" Polished a bit by aeb. .\" .\" %%%LICENSE_START(PUBLIC_DOMAIN) .\" Placed in the Public Domain. .\" %%%LICENSE_END .\" .\" 2005-06-16 mtk, mentioned freopen() .\" 2007-12-08, mtk, Converted from mdoc to man macros .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH stdin 3 "2 мая 2024 г." "Справочные страницы Linux 6.9.1" .SH ИМЯ stdin, stdout, stderr \- стандартные потоки ввода/вывода .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBextern FILE *\fP\fIstdin\fP\fB;\fP \fBextern FILE *\fP\fIstdout\fP\fB;\fP \fBextern FILE *\fP\fIstderr\fP\fB;\fP .fi .SH ОПИСАНИЕ В обычном состоянии каждая программа UNIX после запуска имеет при открытых потока, один для ввода данных, один для вывода и один для печати диагностических сообщений или ошибок. Обычно, они присоединены к терминалу пользователя (смотрите \fBtty\fP(4)), но также они могут ссылаться на файлы или другие устройства, в зависимости от того, как это настроил родительский процесс (также смотрите раздел «Перенаправление (redirection)» в \fBsh\fP(1)). .P Входной поток называют «стандартным вводом»; выходной поток называют «стандартным выводом»; поток ошибок называют «стандартным потоком ошибок». Эти термины в сокращённой форме (символы \fIstdin\fP, \fIstdout\fP и \fIstderr\fP) используются для обращения к соответствующим файлам. .P Каждый из этих символов является макросом \fBstdio\fP(3) с типом указателя на \fIFILE\fP и может быть использован в функциях вроде \fBfprintf\fP(3) или \fBfread\fP(3). .P Так как \fIFILE\fP — буферная обёртка вокруг файловых дескрипторов UNIX, файлы, на которые она ссылается, могут быть доступны через обычный низкоуровневый файловый интерфейс UNIX, то есть через функции \fBread\fP(2) и \fBlseek\fP(2). .P При запуске программы с потоками \fIstdin\fP, \fIstdout\fP и \fIstderr\fP связываются целочисленные файловые дескрипторы 0, 1 и 2, соответственно. Для этих значений в \fI\fP определены препроцессорные символы \fBSTDIN_FILENO\fP, \fBSTDOUT_FILENO\fP и \fBSTDERR_FILENO\fP (с помощью \fBfreopen\fP(3) у любого из этих потоков можно изменить номер файлового дескриптора, связанного с потоком). .P Заметим, что одновременное использование \fIFILE\fP и низкоуровневых файловых дескрипторов может привести к непредсказуемым результатам и этого нужно избегать (для мазохистов: в POSIX.1, раздел 8.2.3, подробно описано как должно работать такое взаимодействие). Общее правило: файловые дескрипторы обрабатываются в ядре, а stdio всего лишь библиотека. Это означает, что, например, после \fBexec\fP(3) потомок наследует все открытые файловые дескрипторы, но все старые потоки становятся недоступными. .P Так как символы \fIstdin\fP, \fIstdout\fP и \fIstderr\fP определены как макросы, присвоение им значения непереносимо. Стандартные потоки можно связать с различными файлами с помощью библиотечной функции \fBfreopen\fP(3), специально созданной для переназначения \fIstdin\fP, \fIstdout\fP и \fIstderr\fP. Стандартные потоки закрываются вызовом \fBexit\fP(3) и при нормально завершении программы. .SH СТАНДАРТЫ C11, POSIX.1\-2008. .P The standards also stipulate that these three streams shall be open at program startup. .SH ИСТОРИЯ C89, POSIX.1\-2001. .SH ПРИМЕЧАНИЯ Поток \fIstderr\fP является небуферизованным. Поток \fIstdout\fP буферизируется построчно, если подключён к терминалу. Часть строки не появляется до тех пор, пока не будет вызвана функция \fBfflush\fP(3) или \fBexit\fP(3), или не появится символ новой строки. Это может приводить к неожиданным результатам, особенно при выводе диагностических сообщений. Режим буферизации стандартных потоков (или любого другого потока) модно изменить с помощью вызова \fBsetbuf\fP(3) или \fBsetvbuf\fP(3). Заметим, что в случае когда \fIstdin\fP связан с терминалом, также может быть буферизация ввода в драйвере терминала, никак не связанная с буферизацией stdio (более того, обычный терминальный ввод буферизируется построчно в ядре). Работу ядра по обработке ввода можно изменить с помощью вызова \fBtcsetattr\fP(3) и подобным; также смотрите \fBstty\fP(1) и \fBtermios\fP(3). .SH "СМОТРИТЕ ТАКЖЕ" \fBcsh\fP(1), \fBsh\fP(1), \fBopen\fP(2), \fBfopen\fP(3), \fBstdio\fP(3) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .