2017-09-15 9 views
2

私は野生のこのようなコードに遭遇しましたが、なぜこれが機能するのか不思議です。 コードはstdin(fd == 0)ではなくstderr(fd == 2)から読み込みます。これは実際には幾分かの問題です。コンソールで入力を読むことはできますが、パイプで入力することはできません。何がここで何が起こっている考えですか?stdinの代わりにstderrを読む

#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つのファイル記述子は、同じファイルが3回開かれたものです(オプションが異なる場合もあります)。

ときパイプコンテンツ、それはもはやケースではないとstdout/stderrのは別である一方で、標準入力が今、一つのことですので、この壊れたコードは、もはや機能します。あなたのコードサンプルで

それはそうしても意味がありませんし、最高のバグとして説明されるだろう。しかし、おそらく、その "コードは野生の"コードの著者は、何か違うことをしようとしていたし、その理由を持っていたかもしれません。見つけたコードサンプルのリファレンスがありますか?

+0

\意味をなさない「の代わりに標準エラー出力の標準エラー出力からの読み取り」と言う: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

関連する問題