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