stdinC和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 的宏,它代表管道的标准输入。