Skip to content

Home Программирование Консольный ввод-вывод
Консольный ввод-вывод

Вернемся ненадолго к механизмам файлового ввода-вывода стандартной библиотеки языка С. Мы уже говорили, что файловые указатели с именами stdin, stdout и stderr связаны со стандартным вводом, стандартным выводом и со стандартным потоком ошибок соответственно. Чтение и запись этих файлов называется консольным вводом-выводом. Проведем небольшой эксперимент. Для этого напишем простую программу

Программа stdoutrpopen.с

#include <stdlib.h> 
#include <stdio.h>
int main (void)
{
fclose (stdout);
stdout = fopen ("anyfile", "w");
if (stdout == NULL) abort ();
printf ("Hello World!\n");
return 0;
}

Теперь откомпилируем и запустим эту программу:

$ gcc -о stdoutreopen stdoutreopen.с $ ./stdoutreopen $ cat anyfile Hello World!

Программа на экран ничего не вывела, поскольку мы сначала закрыли стандартный вывод, а потом открыли его заново, но, на этот раз, связали его не с терминалом, а с файлом на диске.

Механизмы низкоуровневого ввода-вывода тоже имеют свою абстракцию консольного ввода-вывода. Это файлы с дескрипторами 0 (стандартный ввод), 1 (стандартный вывод) и 2 (стандартный поток ошибок). Реже используется их символическое представление в виде констант препроцессора, объявленных в файле unistd.h:

#define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILEKO2

Иногда начинающие программисты не могут понять, чем технически отличается стандартный поток ошибок от стандартного вывода. Во-первых, это разные файлы. Следовательно, они могут быть перенаправлены в разные места. В оболочке bash, например, можно заставить любую программу писать свои ошибки в обычный файл:

$ gcc 2>errors $ cat errors gcc: no input files

Приведенный пример демонстрирует концепцию перенаправления (redirection) потоков ввода-вывода средствами оболочки bash. Если бы ошибки выводились функцией printf о, то их трудно было бы отделить от обычных сообщений программы.

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

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top