2010-08-17 35 views
2

我正在用C++設計一個MIPS模擬器,並且我的簡化操作系統必須能夠偶爾運行stat()(當我的模擬器上正在執行的程序需要輸入或輸出或其他東西時。)關於STDIN STDOUT STDERR的問題

問題是,我需要能夠將STDIN,STDOUT和STDERR作爲參數stat「stat(」stdin「,buff)」,其中buff是指向插入點的指針,對於返回的結構數據,在記憶中。實際上,我將使用fstat(),它使用文件描述符來指向要進行統計的文件。我的簡單操作系統中的文件描述符表爲stdin,stdout和stderr保留0,1和2。我對STDIN等有點困惑。它們是流,我意識到它們是在stdio.h中定義的,但是我怎樣才能得到一個stat結構體,其中包含每個這些流的文件的所有相關信息?

回答

4

在一個POSIX系統,你可以使用fileno()FILE*(例如stdinstdoutstderr)轉換爲整數文件描述符。正如James所說,該文件描述符可以發送到fstat()

+0

據我所知0,1和2是stdin,stdout和stderr的保留文件描述符。所以我的文件描述符表可以提供stat()文件的文件名。事情是,我在C++中的文件描述符表是一個向量,在該向量中,我將打開的文件的文件名壓入向量中,啓動時向量的前三個元素是「STDIN」,「STDOUT」和「STDERR」 。但我不知道如何在STDIN上運行stat()(例如)。 stdin是否會創建一個可以運行stat()的臨時文件? – 2010-08-17 18:35:28

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. 
手冊頁

here在posix手冊頁上,我將引用fileno - map a stream pointer to a file descriptor ....