C中stdin
和STDIN_FILENO
之间的实际差异(如果有)?
答案 0 :(得分:36)
界面。像其他人一样,stdin
是标准c库定义的FILE *
。您可以使用某些更高级别的界面,例如fread
,fwrite
和fprintf
。另一方面,STDIN_FILENO
只是一个文件描述符(几乎肯定是0)。这通过类似read
和write
的
答案 1 :(得分:14)
stdin
是一个默认的FILE指针,用于从标准输入中获取输入。
STDIN_FILENO
是默认的标准输入文件描述符编号,0
。它本质上是一般用途的定义指令。
答案 2 :(得分:4)
来自 /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. */
例如,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;
}
答案 3 :(得分:0)
stdin:1.文件指针(* FILE) 2.文件描述符表在处理过程中保留其地址 创建。 3.存在于/usr/include/stdio.h
STDIN_FILENO:1.这是一个宏 2.它只是文件描述符表的数组索引 (默认为0)。 3.出现在/usr/include/unistd.h
通过以下代码可以更清楚。
q = fclusterdata(X, t=1, metric='mahalanobis')
答案 4 :(得分:0)
Linux 头文件中的 STDIN_FILENO #include "unistd.h" 只是 0 的宏,当您使用 Linux 管道时,它代表管道的标准输入。