STDIN_FILENO的作用及與stdin 的區別

2puT發表於2016-07-09

1.STDIN_FILENO的作用

STDIN_FILENO屬於系統API介面庫,其宣告為 int 型,是一個開啟檔案控制程式碼,對應的函式主要包括 open/read/write/close 等系統級呼叫。

作業系統一級提供的檔案API都是以檔案描述符來表示檔案。STDIN_FILENO就是標準輸入裝置(一般是鍵盤)的檔案描述符。


2.區別

1)資料型別不一致:
stdin型別為 FILE*
STDIN_FILENO型別為 int
使用stdin的函式主要有:fread、fwrite、fclose等,基本上都以f開頭
使用STDIN_FILENO的函式有:read、write、close等

2)stdin等是FILE *型別,屬於標準I/O,高階的輸入輸出函式。在<stdio.h>。
STDIN_FILENO等是檔案描述符,是非負整數,一般定義為0, 1, 2,屬於沒有buffer的I/O,直接呼叫系統呼叫,在<unistd.h>。

3)STDIN_FILENO 是標準輸入的檔案描述符
詳見/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. */

4)層次不一樣。STDIN 屬於標準庫處理的輸入流,其宣告為 FILE 型的,對應的函式前面都有f開頭,如fopen/fread/fwrite/fclose 標準庫呼叫等
STDIN_FILENO屬於系統API介面庫,其宣告為 int 型,是一個開啟檔案控制程式碼,對應的函式主要包括 open/read/write/close 等系統級呼叫。

標準庫內封裝了系統 API 呼叫,如 fread 內部實現呼叫 read。

5)作業系統一級提供的檔案API都是以檔案描述符來表示檔案。STDIN_FILENO就是標準輸入裝置(一般是鍵盤)的檔案描述符。

6)曾經很納悶,為什麼一個整形fd(STDIN_FILENO=0)就可以代表一個開啟的檔案呢?
後來明白了,和我們的手機號是類似的,手機號只是一個9位數的整形,但是在移動通話網路裡,它就可以用來區分不同的手機終端。

標準C++一級提供的檔案操作函式庫都是用FILE*來表示檔案,stdin就是指向標準輸入裝置檔案的FILE*。

相關文章