Вопрос о Stdin Stdout Stderr
-
29-09-2019 - |
Вопрос
Я проектирую симулятор MIPS в C ++, и моя упрощенная ОС должна иметь возможность выполнять статура () иногда (когда программа выполняется на моем симуляторе, требует ввода или вывода или чего-либо.)
Проблема в том, что мне нужно быть в состоянии утверждать Stdin, Stdout и Stderr в качестве параметров для статистики «stat» («stdin», buff), где Buff является указателем на точку вставки, для возвращаемых данных struct в памяти. В действительности я буду использовать fStat (), который использует файловые дескрипторы, чтобы указывать на файл, чтобы быть статированным. Моя таблица дескрипторов файлов в моих простых резервах ОС 0, 1 и 2 для Stdin, Stdout и Stderr. Я немного смущен тем, что такое Stdin и т. Д. Они потоки, я понимаю, что они определены в stdio.h, но как в мире я получаю структуру статистики со всей соответствующей информацией о файле для каждого из этих потоков?
Решение
В системе POSIX вы можете использовать fileno()
чтобы преобразовать из FILE*
(например stdin
, stdout
, stderr
) до целочисленного файлового дескриптора. Этот файл дескриптор может быть отправлен на fstat()
.
Другие советы
Вот очень хорошо известный пример того, как определить, если стандартный выходной выход перенаправляется в файл, чтобы проиллюстрировать использование POSIX's fileno
функция
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
....