Wat is het eventuele praktische verschil tussen stdin
en STDIN_FILENO
in C?
Antwoord 1, autoriteit 100%
De interface. Zoals iedereen heeft gezegd, is stdin
een FILE *
zoals gedefinieerd door de standaard c-bibliotheek. Je kunt een aantal interfaces op een hoger niveau gebruiken, zoals fread
, fwrite
en fprintf
. Aan de andere kant is STDIN_FILENO
slechts een bestandsdescriptor (vrijwel zeker 0). Dit maakt gebruik van een interface op een iets lager niveau door middel van read
en write
.
Antwoord 2, autoriteit 36%
stdin
is een standaard FILE-aanwijzer die wordt gebruikt om invoer te krijgen van niemand minder dan standaard in.
STDIN_FILENO
is het standaard descriptornummer van het invoerbestand dat 0
is. 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_FILE
gedefinieerd in /usr/include/libio.h
) is een structuur gegevens. STDIN_FILENO
is 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.