stdin
C和C之间的实际区别是什么(如果有的话)STDIN_FILENO
?
5 回答
界面。就像其他人所说stdin
的那样,是FILE *
标准c库定义的。您可以使用一些更高级别的接口,例如fread
、fwrite
和fprintf
。另一方面,STDIN_FILENO
只是一个文件描述符(几乎可以肯定是0)。read
这通过和之类的使用了一个稍低级别的接口write
。
stdin
是一个默认的 FILE 指针,用于从标准输入中获取输入。
STDIN_FILENO
是默认的标准输入文件描述符编号,即0
. 它本质上是一个已定义的通用指令。
从/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;
}
标准输入: 1. 文件指针 (* FILE) 2. 文件描述符表在进程创建时保存其地址。3. 存在于 /usr/include/stdio.h
STDIN_FILENO : 1. 它是一个宏 2. 它只不过是文件描述符表的数组索引(默认为 0)。3.存在于/usr/include/unistd.h
通过以下代码可以更清楚。
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
return 0;
}
当您使用 Linux 管道时,Linux 标头 #include "unistd.h" 中的 STDIN_FILENO 只是 0 的宏,它代表管道的标准输入。