2013-02-27 61 views
27

C中的stdinSTDIN_FILENO之间的实际区别是什么?stdin和STDIN_FILENO有什么区别?

+1

[关于该主题的有趣讨论](http://www.rtems.com/ml/rtems-users/2011/march/msg00101.html)。也许你还应该问为什么'fileno(stdin)'与'STDIN_FILENO'不同。 – user7116 2013-02-27 02:50:00

+0

@ user7116您的链接已遗失。 – 2014-02-27 06:13:51

+0

此链接的作品http://www.rtems.org/ml/rtems-users/2011/march/thrd1.html#00101 – pixelbeat 2014-03-19 01:10:48

回答

27

接口。像其他人一样,stdin是由标准c库定义的FILE *。您可以使用freadfwritefprintf等一些更高级别的接口。另一方面,STDIN_FILENO只是一个文件描述符(几乎可以肯定是0)。这通过诸如readwrite之类的使用略微较低级别的接口。

+11

没有一个答案提到'STDIN_FILENO'是''中定义的一个宏。至少对于符合POSIX的系统来说,它不仅仅是“几乎肯定是0 “;它需要被定义为0.同样,'ST DOUT_FILENO'为1,'STDERR_FILENO'为2. – 2015-04-06 20:32:39

+0

@KeithThompson谢谢,正在寻找这个! – KGCybeX 2016-10-20 17:34:13

12

stdin是用于从没有比标准等中获得输入默认文件指针。

STDIN_FILENO是默认的标准输入文件描述符数是0。它基本上是一个通用的定义指令。

1

/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; 
}