stdin STDIN FILENO區別和重定向

2021-07-11 23:04:52 字數 2420 閱讀 9084

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,高階的輸入輸出函式。在。

stdin_fileno等是檔案描述符,是非負整數,一般定義為0, 1, 2,屬於沒有buffer的i/o,直接呼叫系統呼叫,在。

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

stdin,stdout,stderr和重定向

c程式自動開啟3個檔案,標準輸入,標準輸出和標準錯誤輸出。預設情況下分別指向鍵盤,顯示器,顯示器。這裡的檔案指的是指向file的指標。file是stdio.h中定義的一種派生型別。file型別指標,指向乙個關於檔案資訊的資料報,其中包括檔案i o使用的緩衝區的資訊。stdin,stdout,stde...

Linux Linux printf 輸出重定向

方法一 include include include include include intmain 方法二 include include include intmain 到這裡我們就可以輕鬆解決 prinft 不輸出到螢幕的問題了.不外乎兩種情況.第1 標準輸出被重定向了.第2 輸出緩衝區的問...

Linux Linux printf 輸出重定向

方法一 include include include include include intmain 方法二 include include include intmain 到這裡我們就可以輕鬆解決 prinft 不輸出到螢幕的問題了.不外乎兩種情況.第1 標準輸出被重定向了.第2 輸出緩衝區的問...