Я боюсь, що ваше розуміння повністю відстало. :)
Подумайте про "стандартний", "стандартний вихід" та "стандартну помилку" з точки зору програми , а не з точки зору ядра.
Коли програмі потрібно надрукувати вихід, вона зазвичай друкується на «стандартне виведення». Програма, як правило, друкує вихід на стандартний з printf
, який друкує ТОЛЬКО для стандартного виведення.
Коли програмі потрібно друкувати інформацію про помилки (не обов'язково винятки, це конструкція мови програмування, накладена на набагато більш високий рівень), вона зазвичай друкує до "стандартної помилки". Зазвичай це робиться за допомогою fprintf
, який приймає потік файлів для використання під час друку. Потоком файлу може бути будь-який файл, відкритий для запису: стандартний вихід, стандартна помилка або будь-який інший файл, відкритий за допомогою fopen
або fdopen
.
"standard in" використовується, коли файлу потрібно читати вхід, використовуючи 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. Я подумав зробити це просто і використовувати простіші функції, але я все-таки вважав, що ви повинні знати альтернативи. :)