2010-08-17 4 views
2

Я проектирую симулятор MIPS в C++, и моя упрощенная ОС должна иметь возможность запускать stat() иногда (когда программа, выполняемая на моем симуляторе, требует ввода или вывода или что-то в этом роде.)Вопрос о STDIN STDOUT STDERR

Проблема заключается в том, что я должен иметь возможность утверждать STDIN, STDOUT и STDERR в качестве параметров stat stat ("stdin", buff) ", где buff - это указатель на точку вставки, для возвращаемых данных структуры, в памяти. На самом деле я буду использовать fstat(), который использует файловые дескрипторы, чтобы указать на файл, который будет установлен. Моя таблица дескрипторов файлов в моей простой ОС резервирует 0, 1 и 2 для stdin, stdout и stderr. Я немного смущен тем, что такое STDIN и т. Д. Это потоки, я понимаю, что они определены в stdio.h, но как в мире я получаю структуру stat со всей необходимой информацией о файле для каждого из этих потоков?

ответ

4

В системе POSIX, вы можете использовать fileno() Для преобразования FILE* (например stdin, stdout, stderr) для дескриптора файла целое. Этот дескриптор файла можно отправить в fstat(), как сказал Джеймс.

+0

Насколько я понял, 0, 1 и 2 были зарезервированными файловыми дескрипторами для stdin, stdout и stderr. Поэтому моя таблица дескрипторов файлов может предоставить stat() имена файлов. Дело в том, что моя таблица дескрипторов файлов в C++ - это вектор, в который я вставляю имя файла открытого файла в вектор, а первые три элемента вектора при запуске - это «STDIN», «STDOUT» и «STDERR», , Но я не знаю, как именно запустить stat() на STDIN (например). Создает ли stdin временный файл, на котором я могу запустить stat()? –

0

Вот очень хорошо известный пример того, как определить, является ли стандартный терминальный вывод перенаправляется в файл, чтобы проиллюстрировать использование fileno функции POSIX в

if (!isatty(fileno(stdout))){ 
    fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n"); 
    return 1; 
} 

При использовании приведенного выше кода в программе и указанная программа была выполнена, как этот

 
foobar_program > foobar_program.output 

'foobar_program.output' будет содержать

 
argv, argc, someone is redirecting me elsewhere...\n 

указатель файл потока не более, чем структура типа указателя на FILE, т.е. FILE *, fileno принимает эту структуру и преобразует его в соответствующий дескриптор файла, соответственно, к странице руководства для fileno здесь

 
The function fileno() examines the argument stream and returns 
its integer descriptor. 

, а также here на страницах руководства posix, и я приведу fileno - map a stream pointer to a file descriptor ....

Смежные вопросы