1. 程式人生 > >STDIN_FILENO與stdin區別(轉)

STDIN_FILENO與stdin區別(轉)

strong 出現 stdin cti efi 兩個 正常 span col

標準輸入 (stdin)

標準輸入是指數據(通常是文件)走向程序。程序要求數據傳輸使用的運算。並非所有程序都要求輸入。如dirls程序(顯示一個目錄中的文件名)運行時不用任何輸入。

除非重導向,輸入預期由 鍵盤取得。

標準輸入的文件描述子為 0 (零)。POSIX <unistd.h> 定義是 STDIN_FILENO;相對應的 <stdio.h> 變量為 FILE* stdin ;類似地, <iostream> 變量為 std::cin

標準輸出 (stdout)

標準輸入是指程序寫輸出數據的流。程序要求數據傳輸使用的運算。並非所有程序都要求輸出。如mv

ren程序在成功完成時是沈默的。

除非重導向,輸入為 終端。

標準輸出的文件描述子為 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::cerrstd::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區別(轉)