Боюсь, ваше понимание полностью отсталое.:)
Подумайте о «стандартном входе», «стандартном выходе» и «стандартной ошибке» с точки зрения программы *1003*, а не с точки зрения ядра.
КогдаПрограмма должна распечатать вывод, обычно она печатает в «стандартный формат».Программа обычно печатает вывод на стандартный вывод с помощью printf
, который печатает ТОЛЬКО на стандартный вывод.
Когда программе необходимо напечатать информацию об ошибке (не обязательно исключения, это конструкция языка программирования, наложенная нанамного более высокий уровень), он обычно печатает до «стандартной ошибки».Обычно это происходит с fprintf
, который принимает файловый поток для использования при печати.Файловым потоком может быть любой файл, открытый для записи: стандартный вывод, стандартная ошибка или любой другой файл, открытый с помощью fopen
или fdopen
.
«стандартный вход» используется, когда файл необходимдля чтения ввода, используя fread
или fgets
, или getchar
.
Любой из этих файлов может быть легко перенаправлен из оболочки, например:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Или вся энчилада:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Есть два важных предостережения: во-первых, «стандартный вход», «стандартный выход» и «стандартная ошибка» - это просто соглашение.Это очень сильное соглашение, но все это просто соглашение, что очень приятно иметь возможность запускать программы, подобные этой: grep echo /etc/services | awk '{print $2;}' | sort
и иметь стандартные выходные данные каждой программы, подключенные к стандартному входуследующая программа в конвейере.
Во-вторых, я дал стандартные функции ISO C для работы с файловыми потоками (FILE *
объекты) - на уровне ядра, это все файловые дескрипторы (int
ссылки на таблицу файлов) и многие операции более низкого уровня, такие как read
и write
, которые не выполняют удачную буферизацию функций ISO C.Я решил сделать это простым и использовать более легкие функции, но я все же подумал, что вы должны знать альтернативы.:)