关于STDIN STDOUT STDERR的问题

时间:2010-08-17 18:08:29

标签: c++ statistics stream file-descriptor

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

问题是,我需要能够断言STDIN,STDOUT和STDERR作为stat“stat(”stdin“,buff)的参数”其中buff是指向插入点的指针,对于返回的struct数据,在记忆中。实际上我将使用fstat(),它使用文件描述符指向要统计的文件。我的简单操作系统中的文件描述符表为stdin,stdout和stderr保留0,1和2。我对STDIN等有些困惑。它们是流,我意识到,它们是在stdio.h中定义的,但是我在世界上如何获得一个stat结构,其中包含有关每个流的文件的所有相关信息?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

这是一个众所周知的示例,说明如何确定标准终端输出是否重定向到文件以说明POSIX的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手册页上的

here,我引用fileno - map a stream pointer to a file descriptor ....