Was ist der praktische Unterschied, wenn überhaupt, zwischen stdin
und STDIN_FILENO
in C?
Was ist der Unterschied zwischen stdin und STDIN_FILENO?
Benutzer1212697
Michael
Die Schnittstelle. Wie alle anderen gesagt haben, stdin
ist ein FILE *
wie von der Standard-c-Bibliothek definiert. Sie können einige der Schnittstellen auf höherer Ebene verwenden, z fread
, fwrite
und fprintf
. Auf der anderen Seite, STDIN_FILENO
ist nur ein Dateideskriptor (mit ziemlicher Sicherheit 0). Dies verwendet eine etwas niedrigere Benutzeroberfläche wie z read
und write
.
-
Keine der Antworten erwähnt das
STDIN_FILENO
ist ein Makro, das in definiert ist<unistd.h>
. Zumindest für ein POSIX-kompatibles System ist es nicht nur “fast sicher 0”; es muss als 0 definiert werden.STDOUT_FILENO
ist 1 undSTDERR_FILENO
ist 2.– Keith Thompson
6. April 2015 um 20:32 Uhr
-
Das
<unistd.h>
Header […] und die beiden KonstantenSTDIN_FILENO
undSTDOUT_FILENO
sind Teil des POSIX-Standards […]. Dieser Header enthält Funktionsprototypen für viele der UNIX-Systemdienste, wie zread
undwrite
Funktionen, die wir aufrufen. Die KonstantenSTDIN_FILENO
undSTDOUT_FILENO
sind darin definiert<unistd.h>
und geben Sie die Dateideskriptoren für Standardeingabe und Standardausgabe an. Diese Werte sind0
und1
, wie von POSIX.1 gefordert, aber wir verwenden die Namen zur besseren Lesbarkeit. — Quelle: Advanced Programming in the Unix ® Environment – 2nd edition page 9– Nabil Kadimi
29. September 2018 um 19:12 Uhr
squiguy
stdin
ist ein Standard-DATEI-Zeiger, der verwendet wird, um Eingaben von niemand anderem als Standard in zu erhalten.
STDIN_FILENO
ist die standardmäßige Deskriptornummer der Standardeingabedatei, die lautet 0
. Es ist im Wesentlichen eine definierte Richtlinie für den allgemeinen Gebrauch.
debuggen
Aus /usr/include/stdio.h
,
/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
Aus /usr/include/unistd.h
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Ex, stdin
(_IO_FILE
definiert in /usr/include/libio.h
) sind Strukturdaten. STDIN_FILENO
ist eine Makrokonstante, die auf einen vom Kernel verwendeten Dateideskriptor zeigt.
#include <stdio.h>
#include <unistd.h>
void
stdin_VS_STDIN_FILENO(void)
{
printf("stdin->_flags = %hd\n", stdin->_flags);
printf("STDIN_FILENO : %d\n", STDIN_FILENO);
}
int
main(void)
{
stdin_VS_STDIN_FILENO();
return 0;
}
stdin : 1. Ein Dateizeiger (* FILE) 2. Die Dateideskriptortabelle enthält ihre Adresse, wenn der Prozess erstellt wird. 3. vorhanden in /usr/include/stdio.h
STDIN_FILENO : 1. Es ist ein Makro 2. Es ist nichts als ein Array-Index einer Dateideskriptortabelle (Standard 0). 3. vorhanden in /usr/include/unistd.h
Könnte durch folgenden Code klarer sein.
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
return 0;
}
Die STDIN_FILENO im Linux-Header #include “unistd.h” ist nur ein Makro für 0, das für die stdin für die Pipe steht, wenn Sie Linux-Pipe verwenden.
-
Sie haben Recht, aber (Nickerchen) Pfeifen haben damit nichts zu tun. Die Standardeingabe ist beispielsweise nicht immer eine Pipe
./command < some_file
in bash wird keine Pipe erstellt. Sie können überprüfen, ob es sich um ein Rohr handelt oder nicht, indem Sie die Rohrgröße abrufen:fcntl(STDIN_FILENO, F_GETPIPE_SZ)
kehrt zurück-1
in diesem Fall. Der gleiche Anruf kommt zurück65536
(oder eine andere positive Ganzzahl, ymmv), wenn stdin eine Pipe ist (cat some_file | ./command
)– Erich
28. Mai um 11:11 Uhr
-
Sie haben Recht, aber (Nickerchen) Pfeifen haben damit nichts zu tun. Die Standardeingabe ist beispielsweise nicht immer eine Pipe
./command < some_file
in bash wird keine Pipe erstellt. Sie können überprüfen, ob es sich um ein Rohr handelt oder nicht, indem Sie die Rohrgröße abrufen:fcntl(STDIN_FILENO, F_GETPIPE_SZ)
kehrt zurück-1
in diesem Fall. Der gleiche Anruf kommt zurück65536
(oder eine andere positive Ganzzahl, ymmv), wenn stdin eine Pipe ist (cat some_file | ./command
)– Erich
28. Mai um 11:11 Uhr
Eine interessante Diskussion zum Thema. Vielleicht sollten Sie auch fragen, warum
fileno(stdin)
unterscheidet sich vonSTDIN_FILENO
.– Benutzer7116
27. Februar 2013 um 2:50 Uhr
@user7116 Dein Link ist leider tot.
– Jonathon Reinhart
27. Februar 2014 um 6:13 Uhr
@pixelbeat, dein Link ist auch tot 🙁 Hat jemand eine informative Lektüre zu diesem Thema?
– Benutzer2469227
12. Juli 2014 um 17:21 Uhr
Letzter Link scheint zu sein: listen.rtems.org/pipermail/users/2011-March/023277.html
– David Arnold
23. August 2016 um 23:29 Uhr
Ich kläre diese Angelegenheit ein für alle Mal: web.archive.org/web/20180127193256/https://lists.rtems.org/…
– Ebene
27. Januar 2018 um 19:37 Uhr