Was ist der Unterschied zwischen stdin und STDIN_FILENO?

Lesezeit: 4 Minuten

Benutzeravatar von user1212697
Benutzer1212697

Was ist der praktische Unterschied, wenn überhaupt, zwischen stdin und STDIN_FILENO in C?

Michaels Benutzeravatar
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, fwriteund 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 und STDERR_FILENO ist 2.

    – Keith Thompson

    6. April 2015 um 20:32 Uhr


  • Das <unistd.h> Header […] und die beiden Konstanten STDIN_FILENO und STDOUT_FILENO sind Teil des POSIX-Standards […]. Dieser Header enthält Funktionsprototypen für viele der UNIX-Systemdienste, wie z read und write Funktionen, die wir aufrufen. Die Konstanten STDIN_FILENO und STDOUT_FILENO sind darin definiert <unistd.h> und geben Sie die Dateideskriptoren für Standardeingabe und Standardausgabe an. Diese Werte sind 0 und 1, 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


Benutzeravatar von squiguy
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.

Benutzeravatar von debug
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ück 65536 (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ück 65536 (oder eine andere positive Ganzzahl, ymmv), wenn stdin eine Pipe ist (cat some_file | ./command)

    – Erich

    28. Mai um 11:11 Uhr


1411180cookie-checkWas ist der Unterschied zwischen stdin und STDIN_FILENO?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy