Каждому процессу сопоставлена таблица открытых им файлов. Три первых позиции в этой таблице заняты всегда: каждый процесс открывает потоки (помните, что в UNIX файл — это и есть поток данных?) для ввода и вывода данных, а также вывода сообщений об ошибках и другой диагностической информации.
Эти потоки:
· 0 — стандартный ввод (stdin), по этому каналу данные передаются программе;
· 1 — стандартный вывод (stdout), по этому каналу программа выводит результаты своей работы;
· 2 — стандартный поток сообщений об ошибках (stderr). По этому каналу программы выдают информацию об ошибках.
Ссылаться на эти потоки можно по их файловым дескрипторам. 0,1 и 2 - это и есть такие дескрипторы.
Из стандартного входа программа может только читать, а два других потока могут использоваться программой только для записи.
По умолчанию входной поток связан с клавиатурой, а выходной поток и поток сообщений об ошибках направлены на терминал пользователя. Другими словами, вся выходная информация запущенной пользователем команды или программы, а также все сообщения об ошибках, выводятся в окно терминала. Однако, как мы увидим чуть ниже, можно перенаправить выходные сообщения (например, в файл).
Для того, чтобы продемонстрировать, как работает стандартный поток ошибок, выполните команду ls с неверным аргументом, например, задав в качестве аргумента имя несуществующего файла. В таком случае ls выведет сообщение об ошибке в стандартный поток ошибок. Для нас, однако, в данном случае стандартный поток ошибок неотличим от выходного потока, поскольку сообщение об ошибке мы видим в окне терминала.
Работу со стандартными входным и выходным потоками лучше всего проиллюстрировать на примере команд echo и cat.