linux 的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出
先給大家看一個很熟悉的例子:
[root@testLinux ~]# ifconfig --查看網(wǎng)卡相關(guān)信息。
從這里可以看出當(dāng)運(yùn)行ifconfig 這個命令,操作系統(tǒng)就會通過顯示器輸出網(wǎng)卡相關(guān)信息,現(xiàn)在我們再回過頭去理解上圖從鍵盤到終端處理程序的這個過程,我們從鍵盤輸入命令,然后交給操作系統(tǒng)內(nèi)核執(zhí)行之后在輸出這樣一個過程,因此我們將這里的這里的鍵盤叫標(biāo)準(zhǔn)輸入,而輸出的結(jié)果通過顯示器顯示出來叫標(biāo)準(zhǔn)輸出,再來看下一個命令的輸出結(jié)果
[root@testLinux ~]# cat /etc/cmss 由于這個文件夾不存在,因此系統(tǒng)輸出了錯誤的輸出,那么我們就稱這種輸出叫標(biāo)準(zhǔn)錯誤輸出。
由于linux 系統(tǒng)的特性,所有設(shè)備都用文件表示,因此上圖的鍵盤(標(biāo)號1)作為標(biāo)準(zhǔn)輸入設(shè)備,它 在linux 里面用/dev/stdin 文件表示,標(biāo)準(zhǔn)輸出設(shè)備 (標(biāo)號3) 即為顯示器用/dev/stdout 文件表示,而標(biāo)準(zhǔn)錯誤輸出設(shè)備(標(biāo)號4)用/dev/stderr文件表示。
1)標(biāo)準(zhǔn)輸入(STDIN) ,文件位置: /dev/stdin ,文件描述符為0
2) 標(biāo)準(zhǔn)輸出 (STDOUT),文件位置:/dev/stdout , 文件描述符表示為1
3) 標(biāo)準(zhǔn)錯誤 (STDERR),文件位置:/dev/stderr 文件描述符表示為2
那么這里何為文件描述符呢?
我們知道操作系統(tǒng)運(yùn)行一個命令或者軟件,操作系統(tǒng)會為該命令或者軟件分配一個進(jìn)程,為了區(qū)分不同的進(jìn)程操作系統(tǒng)使用進(jìn)程號表示,那怎么知道這些進(jìn)程操作了那些文件呢,因此就使用文件描述符表示操作系統(tǒng)操作的哪些文件,下面以一個例子說明。
例如:在后臺一直運(yùn)行這個命令
[root@testLinux network-scripts]# tail -f /etc/sysconfig/network-scripts/ifcfg-ens33
查看該命令對應(yīng)的進(jìn)程號:通過 ps 命令查看到該命令對應(yīng)的進(jìn)程號是 7280
接下里查看該進(jìn)程操作的文件
[root@testLinux network-scripts]# cd /proc/7280/fd
這個目錄下面對應(yīng)的文件即為進(jìn)程號7280操作的文件,用0,1,2,3...這樣的數(shù)字表示,這些數(shù)字也是文件只不過是鏈接文件而已,這里的數(shù)字有一個專門的名稱叫文件描述符,從這里可以得出一個操作系統(tǒng)內(nèi)核分配一個進(jìn)程的路徑是這樣的,在/proc/進(jìn)程號/fd/ ,fd下面即為該命令或者程序操作的文件。
下面再來看一個進(jìn)程號為7349操作的文件
從圖中可以看出該進(jìn)程操作的磁盤文件是/etc/passwd,同樣這里還是有0,1,2 三個文件,因此這里可以得出的結(jié)論是無論進(jìn)程操作的文件是怎樣的,標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤輸出這三個文件都是必須要的,他們分別代表鍵盤,顯示器,這里有個難以理解的點(diǎn)在于,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出設(shè)備默認(rèn)也是指顯示器,只是為了區(qū)別用了不同的文件表示而已。