stdin和STDIN_FILENO有什么区别?

use*_*697 35 c

C 之间stdin和之间的实际区别是什么STDIN_FILENO

Mic*_*ael 39

界面.像其他人所说的那样,stdinFILE *由标准c库定义的.你可以使用一些像更高级别的接口fread,fwritefprintf.另一方面,STDIN_FILENO它只是一个文件描述符(几乎肯定是0).这使用了一个稍微低级的界面,通过readwrite.

  • 没有一个答案提到`STDIN_FILENO`是`<unistd.h>`中定义的宏.至少对于符合POSIX标准的系统,它不仅仅是"几乎肯定是0"; 它需要被定义为0.类似地,`STDOUT_FILENO`是1而``STDERR_FILENO`是2. (21认同)

squ*_*guy 14

stdin 是一个默认的FILE指针,用于从标准输入中获取输入.

STDIN_FILENO是默认的标准输入文件描述符编号0.它本质上是一般用途的定义指令.


deb*_*bug 11

/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
Run Code Online (Sandbox Code Playgroud)

/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.  */
Run Code Online (Sandbox Code Playgroud)

例如,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;
}
Run Code Online (Sandbox Code Playgroud)