2017-09-15 4 views
2

ich in Code lief wie dies in der freien Natur, und ich frage mich, warum das funktioniert. Der Code liest von stderr (fd == 2) anstelle von stdin (fd == 0). Das seltsame Ding ist das funktioniert tatsächlich etwas. Sie können die Eingabe an der Konsole, aber nicht an der Pipe-Eingabe lesen. Irgendeine Idee, was hier vor sich geht?von stderr Lesen statt 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

Ihr Titel sagt „von stderr statt Stderr Lesen“, die \ – Dan

Antwort

5

Gute Frage! Dies funktioniert, weil, wenn Sie an der Konsole im Terminal sind, STDIN, STDOUT und STDERR letztlich alle auf die gleiche Ressource verweisen: /dev/tty (oder was auch immer Ihre Plattform nennt). Die drei Dateideskriptoren sind die gleiche Datei, die dreimal geöffnet wurde (möglicherweise mit verschiedenen Optionen).

Wenn Sie Rohr Inhalt, das ist nicht mehr der Fall, und dieses gebrochene Code nicht mehr funktioniert, da stdin jetzt eine Sache ist, während stdout/stderr eine andere.

In Ihrem Codebeispiel macht es keinen Sinn, dies zu tun und am besten als Fehler beschrieben werden würde. Aber vielleicht hat der Autor dieses "Codes in der Wildnis" versucht, etwas anderes zu tun, und hatte seine Gründe dafür. Haben Sie eine Referenz für das gefundene Codebeispiel?

+0

Der Code hier keinen Sinn macht, ist: https://github.com/riscv/riscv-isa-sim/blob/8969a855132a27769dd6399566dc86ac32b26e76/riscv/interactive.cC# L82 ich denke, es ist ein Fehler – vanjoe

+0

Eigentlich nur eine Antwort auf eine Frage war ich an diesem Repo erhoben: https://github.com/riscv/riscv-isa-sim/issues/124#issuecomment-329922070. Sieht so aus, als wäre es beabsichtigt. – vanjoe