Wat is het verschil tussen stdin en STDIN_FILENO?

Wat is het eventuele praktische verschil tussen stdinen STDIN_FILENOin C?


Antwoord 1, autoriteit 100%

De interface. Zoals iedereen heeft gezegd, is stdineen FILE *zoals gedefinieerd door de standaard c-bibliotheek. Je kunt een aantal interfaces op een hoger niveau gebruiken, zoals fread, fwriteen fprintf. Aan de andere kant is STDIN_FILENOslechts een bestandsdescriptor (vrijwel zeker 0). Dit maakt gebruik van een interface op een iets lager niveau door middel van readen write.


Antwoord 2, autoriteit 36%

stdinis een standaard FILE-aanwijzer die wordt gebruikt om invoer te krijgen van niemand minder dan standaard in.

STDIN_FILENOis het standaard descriptornummer van het invoerbestand dat 0is. Het is in wezen een gedefinieerde richtlijn voor algemeen gebruik.


Antwoord 3, autoriteit 21%

Van /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

Van /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_FILEgedefinieerd in /usr/include/libio.h) is een structuur gegevens. STDIN_FILENOis een macroconstante, die verwijst naar een bestandsdescriptor die door de kernel wordt gebruikt.

#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;
}

Antwoord 4, autoriteit 2%

stdin : 1. Een bestandsaanwijzer (* FILE)
2. De bestandsdescriptortabel bevat zijn adres wanneer het proces is
gemaakt.
3. aanwezig in /usr/include/stdio.h

STDIN_FILENO: 1. Het is een macro
2. Het is niets anders dan een array-index van een bestandsdescriptortabel
(standaard 0).
3.aanwezig in /usr/include/unistd.h

Kan duidelijker zijn door de code te volgen.

#include<stdio.h> 
#include<unistd.h> 
int main() 
{    
     printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
return 0; 
} 

Antwoord 5

De STDIN_FILENO in de linux-header #include “unistd.h” is slechts een macro voor 0 die staat voor de stdin voor de pipe, wanneer u Linux-pipe gebruikt.

Other episodes