STDIN_FILENO與stdin區別(轉)
標準輸入 (stdin)
標準輸入是指數據(通常是文件)走向程序。程序要求數據傳輸使用讀的運算。並非所有程序都要求輸入。如dir或ls程序(顯示一個目錄中的文件名)運行時不用任何輸入。
除非重導向,輸入預期由 鍵盤取得。
標準輸入的文件描述子為 0 (零)。POSIX <unistd.h> 定義是 STDIN_FILENO;相對應的 <stdio.h> 變量為 FILE* stdin ;類似地, <iostream> 變量為 std::cin 。
標準輸出 (stdout)
標準輸入是指程序寫輸出數據的流。程序要求數據傳輸使用寫的運算。並非所有程序都要求輸出。如mv
除非重導向,輸入為 終端。
標準輸出的文件描述子為 1 (一)。POSIX <unistd.h> 定義是 STDOUT_FILENO;相對應的 <stdio.h> 變量為 FILE* stdout;類似地, <iostream> 變量為 std::cout 。
標準錯誤輸出 (stderr)
標準錯誤輸出是另一個輸出流,典型用於程序輸出錯誤消息或診斷。它是獨立於標準輸出的流且可以分別導向。通常目的地為終端。標準錯誤輸出是另一輸出流,用於輸出錯誤消息或診斷。它獨立於標準輸出,且可以分別被重導。常見的目的則為啟始這個程序的終端,即使其標準輸出
把標準輸出和標準錯誤輸出導到相同的目的,如文字終端,是可以(且正常)的。消息會以如同程序寫入的順序來出現,除非有用到緩沖。(例如,一個常見狀況是,當標準錯誤流是未使用緩沖,但標準輸出流是有使用的;在這情況下,如果標準輸出的緩沖器還沒滿的話,較慢寫到標準錯誤的文字可能會較早出現在終端。
標準錯誤輸出的文件描述子為 2 ;POSIX <unistd.h> 定義為 STDERR_FILENO;相對的 <stdio.h> 變量 FILE* stderr。
C++<iostream>
標準頭文件提供兩個相關的變量: std::cerr 和 std::clog,前者用於無緩沖的而後者使用和其它 C++ 流相同的緩沖機制。
主要區別:
1、數據類型不一致
stdin等類型為 FILE *STDIN_FILENO等類型為 int
使用stdin的函數主要有:fread、fwrite、fclose等,基本上都以f開頭
使用STDIN_FILENO的函數有:read、write、close等 2、層次不一致 stdin等屬於標準I/O,高級的輸入輸出函數。在<stdio.h>。 STDIN_FILENO等是文件描述符,是非負整數,一般定義為0, 1, 2,直接調用系統調用,在<unistd.h>。
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
stdin等屬於標準庫處理的輸入流,其聲明為 FILE 型的,對應的函數前面都有f開頭,如fopen/fread/fwrite/fclose 標準庫調用等STDIN_FILENO等屬於系統API接口庫,其聲明為 int 型,是一個打開文件句柄,對應的函數主要包括open/read/write/close 等系統級調用。
關系:
對於stdin等可以使用fileno()函數(用來取得參數stream指定的文件流所使用的文件描述符)來取得該文件流對應的文件描述符。 fileno(stdin) = STDIN_FILENO = 0 fileno(stdout) = STDOUT_FILENO = 1 fileno(stderr) = STDERR_FILENO = 2 -------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
STDIN_FILENO與stdin區別(轉)