Вопрос

Я проектирую симулятор 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....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top