Какова практическая разница, если таковая имеется, между stdin
и STDIN_FILENO
в C?
В чем разница между stdin и STDIN_FILENO?
Ответ 1
Интерфейс. Как и все остальные, stdin
- это FILE *
, как определено стандартной библиотекой c. Вы можете использовать некоторые интерфейсы более высокого уровня, такие как fread
, fwrite
и fprintf
. С другой стороны, STDIN_FILENO
является всего лишь файловым дескриптором (почти наверняка 0). Это использует небольшой интерфейс нижнего уровня, например, read
и write
.
Ответ 2
stdin
- это указатель FILE по умолчанию, используемый для ввода ввода нестандартного значения.
STDIN_FILENO
- стандартный номер дескриптора входного файла по умолчанию, который равен 0
. Это по существу определенная директива для общего использования.
Ответ 3
От /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
От /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
, определенный в /usr/include/libio.h
), является структурными данными. STDIN_FILENO
- это макрокоманда, которая указывает на файловый дескриптор, используемый ядром.
#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;
}