3

我正在用 C++ 设计一个 MIPS 模拟器,我的简化操作系统必须能够偶尔运行 stat() (当在我的模拟器上执行的程序需要输入或输出或其他东西时。)

问题是,我需要能够将 STDIN、STDOUT 和 STDERR 声明为 stat "stat("stdin",buff)" 的参数,其中 buff 是指向插入点的指针,用于在内存中返回的结构数据。实际上,我将使用 fstat() ,它使用文件描述符指向要统计的文件。我的简单操作系统中的文件描述符表为标准输入、标准输出和标准错误保留了 0、1 和 2。我对什么是 STDIN 等感到有点困惑。它们是流,我意识到,它们是在 stdio.h 中定义的,但是我究竟如何获得一个包含有关每个流的文件的所有相关信息的 stat 结构?

4

2 回答 2

5

在 POSIX 系统上,您可以使用fileno()FILE*(例如stdin, stdoutstderr转换为整数文件描述符。该文件描述符可以发送到fstat().

于 2010-08-17T18:23:12.157 回答
-1

下面是一个非常有名的例子,说明如何判断标准终端输出是否被重定向到一个文件来说明 POSIXfileno函数的用法

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

如果在程序中使用上述代码并且该程序是这样执行的

foob​​ar_program > foobar_program.output

'foobar_program.output' 将包含

argv, argc, 有人将我重定向到别处...\n

文件流指针只不过是一个指针类型的结构FILE,即FILE *fileno采用该结构并将其转换为其相关的文件描述符,根据fileno此处的手册页

函数 fileno() 检查参数流并返回
它的整数描述符。

也在posix手册页上,我会引用fileno - map a stream pointer to a file descriptor....

于 2010-08-17T18:40:38.860 回答