Вопрос о STDIN STDOUT STDERR - PullRequest
       42

Вопрос о STDIN STDOUT STDERR

3 голосов
/ 17 августа 2010

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

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

Ответы [ 2 ]

5 голосов
/ 17 августа 2010

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

0 голосов
/ 17 августа 2010

Вот очень хорошо известный пример того, как определить, перенаправлен ли стандартный вывод терминала в файл, чтобы проиллюстрировать использование 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.

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

...