- bullseye-backports 4.17.0-2~bpo11+1
- testing 4.17.0-2
- unstable 4.17.0-2
STDIN(3) | Руководство программиста Linux | STDIN(3) |
ИМЯ¶
stdin, stdout, stderr - стандартные потоки ввода/вывода
СИНТАКСИС¶
#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) и при нормально завершении программы.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Макросы stdin, stdout и stderr соответствуют C89 и этот стандарт также оговаривает, что три этих потока должны открываться при запуске программы.
ЗАМЕЧАНИЯ¶
Поток stderr является небуферизованным. Поток stdout буферизируется построчно, если подключён к терминалу. Часть строки не появляется до тех пор, пока не будет вызвана функция fflush(3) или exit(3), или не появится символ новой строки. Это может приводить к неожиданным результатам, особенно при выводе диагностических сообщений. Режим буферизации стандартных потоков (или любого другого потока) модно изменить с помощью вызова setbuf(3) или setvbuf(3). Заметим, что в случае когда stdin связан с терминалом, также может быть буферизация ввода в драйвере терминала, никак не связанная с буферизацией stdio (более того, обычный терминальный ввод буферизируется построчно в ядре). Работу ядра по обработке ввода можно изменить с помощью вызова tcsetattr(3) и подобным; также смотрите stty(1) и termios(3).
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан 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 версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | Linux |