| Консольный ввод-вывод |
|
Вернемся ненадолго к механизмам файлового ввода-вывода стандартной библиотеки языка С. Мы уже говорили, что файловые указатели с именами stdin, stdout и stderr связаны со стандартным вводом, стандартным выводом и со стандартным потоком ошибок соответственно. Чтение и запись этих файлов называется консольным вводом-выводом. Проведем небольшой эксперимент. Для этого напишем простую программу Программа stdoutrpopen.с #include <stdlib.h> Теперь откомпилируем и запустим эту программу: $ 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) задействует механизм буферизации. Это означает, что сообщения, которые программа пишет в стандартный вывод, отправляются не на терминал, а в буфер. Когда система сочтет нужным, содержимое буфера отправляется на экран терминала.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 389 Комментарии (0)RSS feed CommentsНаписать комментарий |