2017-09-15 92 views
2

我在野外遇到了這樣的代碼,我想知道爲什麼這會起作用。 代碼從stderr(fd == 2)讀取而不是stdin(fd == 0)。奇怪的是,這其實有些作用。您可以在控制檯上閱讀打字,但不能閱讀輸入。任何想法發生了什麼?從stderr而不是stdin讀取

#include <stdio.h> 
#include <unistd.h> 
int main(){ 
    char buf[15]; 
    int nchars=read(2,buf,15); 
    printf("%d '%s'\n",nchars,buf); 
} 
+1

你的標題說,這是沒有意義的\ – Dan

回答

5

好問題!這是有效的,因爲當你在終端的控制檯時,STDIN,STDOUT和STDERR都指向相同的資源:/dev/tty(或者你的平臺調用它)。三個文件描述符是打開3次的相同文件(可能具有不同的選項)。

當你管道內容時,情況不再是這樣了,這個破碎的代碼不再起作用,因爲stdin現在是一件事,而stdout/stderr是另一件事。

在您的代碼示例中,這樣做毫無意義,最好將其描述爲一個錯誤。但也許這個「野外代碼」的作者試圖做一些不同的事情,並有他或她這樣做的理由。你有找到你找到的代碼示例的參考嗎?

+0

「從標準錯誤,而不是stderr讀」代碼是在這裏:https://github.com/riscv/riscv-isa-sim/blob/8969a855132a27769dd6399566dc86ac32b26e76/riscv/interactive.cc #L82我認爲它是一個錯誤 – vanjoe

+0

實際上,對於我在該回購協議中提出的問題,其實只有一個答案:https://github.com/riscv/riscv-isa-sim/issues/124#issuecomment-329922070。看起來這是故意的。 – vanjoe