2013-02-27 62 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; 
}