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 filedescriptors. */
#defineSTDIN_FILENO 0 /* Standard input. */
#defineSTDOUT_FILENO 1 /* Standard output. */
#defineSTDERR_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就是標準輸入設備(一般是鍵盤)的文件描述符。
重定向
Linux 重定向是指修改原來默認的一些東西,對原來系統命令的默認執行方式進行改變,比如說簡單的我不想看到在顯示器的輸出而是希望輸出到某一文件中就可以通過Linux 重定向來進行這項工作。
Linux 默認輸入是鍵盤,輸出是顯示器。你可以用重定向來改變這些設置。比如用wc 命令的時候本來是要手動輸入一篇文字來計算字符數的,用了重定向後可以直接把一個已經寫好的文件用‘<’指向這條命令,就直接可以統計這個文件的字符數等了。輸出也是一樣,你可以把屏幕輸出重定向到一個文件裏,再到文件裏去看結果。重定向操作符可以用來將命令輸入和輸出數據流從默認位置重定向到其他位置,其輸入或輸出數據流的位置稱爲句柄;常見的句柄有三種,當然句柄可以自行擴展,一般的OS都提供類似的功能。句柄 句柄代號 句柄描述
STDIN 0 鍵盤輸入
STDOUT 1 輸出信息到提示符窗口
STDERR 2 輸出錯誤信息到提示符窗口
默認的 < 重定向輸入操作符是 0,而默認的 > 重定向輸出操作符是 1。鍵入 < 或 > 操作符之後,必須指定數據的讀寫位置,可以是文件名或其他現有的句柄。
要指定重定向到現有句柄,請使用與 & 字符,後面接要重定向的句柄號(即 &句柄號)。
例如,下面的命令可以將句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):2>&1
下表列出了可用於重定向輸入和輸出數據流的操作符:
Linux重定向操作符功能描述
> 將命令輸出寫入文件或設備,而不是命令提示符或句柄
< 從文件而不是從鍵盤或句柄讀入命令輸入
>> 將命令輸出添加到文件末尾而不刪除文件中已有的信息
>& 將一個句柄的輸出寫入到另一個句柄的輸入中
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中
| 從一個命令中讀取輸出並將其寫入另一個命令的輸入中;也稱爲管道操作符
現在我們回過頭來看看上面的那條語句mysh > mylog.txt 2>&1就可明白:
> mylog.txt意思是將標準輸出重定向到mylog.txt,等價於mysh1> mylog.txt;
2 >& 1 意思是將錯誤輸出重定向到句柄1標準輸出;綜合起來就是mysh命令執行過程中產生的標準輸出和錯誤輸出都會被重定向到mylog.txt中;
重定向的功能十分強大,有興趣的可以去嘗試各種不同的組合,看看前後位置變下會有什麼結果?
某些時候我們可能並不希望記錄什麼標準輸出或者是錯誤輸出,那可以用mysh >null 2>null或者mysh>/dev/null 2>/dev/null;
屏蔽不想看到的信息:
Linux中有一個特殊的文件/dev/null,這個文件叫做bitbucket,可以接受輸入信息但是什麼都不做。因此要抑制命令的輸出信息,只需要如下操作:
ls /usr/ > /dev/null