linux是文件型系統,全部硬件如軟件都會在對於的目錄下面有相應的文件表示。對於dev這個目錄,咱們知道它下面的文件,表示的是linux的設 備。在windows系統中,設備你們很好理解,象硬盤,磁盤指的是實實在在硬件。而在文件系統的linux下面,都有對於文件與這些設備關聯的。訪問它 們就能夠放到實際硬件,想一想仍是linux靈活了。變成文件,操做該多簡單了。不用調用之前com,prt等接口了。直接讀文件,寫文件就能夠向設備發送 讀或者寫操做了。 按照讀寫存儲數據方式,咱們能夠把設備分爲如下幾種:字符型設備,塊設備,僞設備。linux
1、設備分類 shell
字符型設備windows
字符設備是指每次與系統傳輸1個字符的設備。這些設備節點一般爲傳真、虛擬終端和串口調制解調器、鍵盤之類設備提供流通訊服務,它一般不支持隨機存 取數據。 字符設備在實現時,大多不使用緩存器。系統直接從設備讀取/寫入每個字符。例如,鍵盤這種設備提供的就是一個數據流,當你敲入「cnblogs」這個字 符串時,鍵盤驅動程序會按照和輸入徹底相同的順序返回這個由七個字符組成的數據流。它們是順序的,先返回c,最後是s。centos
塊設備緩存
塊設備是指與系統間用塊的方式移動數據的設備。這些設備節點一般表明可尋址設備,如硬盤、CD-ROM和內存區域。bash
塊設備一般支持隨機存取和尋址,並使用緩存器。操做系統爲輸入輸出分配了緩存以存儲一塊數據。當程序向設備發送了讀取或者寫入數據的請求時,系統把 數據中的每個字符存儲在適當的緩存中。當緩存被填滿時,會採起適當的操做(把數據傳走),然後系統清空緩存。它與字符設備不一樣之處就是,是否支持隨機存 儲。字符型是流形式,逐一存儲。dom
僞設備socket
在類Unix操做系統中,設備節點並不必定要對應物理設備。沒有這種對應關係的設備是僞設備。操做系統運用了它們提供的多種功能。部份常用到的僞設備包括: null,zero,full,loop,random,urandomtcp
2、特殊設備及使用工具
這裏說到特殊設備除了硬盤主板等,只是它在linux shell命令裏面,有特殊的做用,所以把它們單獨拿出來。這些設備分別是:
/dev/stdin
/dev/stdout
/dev/stderr
/dev/null
/dev/zero
/dev/full
/dev/random,urandom
/dev/fd
/dev/tcp|upd
/dev/loop
一、標準輸出輸入設備
還記得上次說的,linux重定向嗎?能夠看下:linux shell數據重定向(輸入重定向與輸出重定向)詳細分析 。它們就是與幾個特殊文件描述符對應,fd0,fd1,fd2 (stdin,stdout,stderr)
如:
[chengmo@centos5 shell]$ cat>teststdin</dev/stdin test #ctrl+D #cat從/dev/stdin得到數據,而後將標準輸出,輸入的到teststdin文件 [chengmo@centos5 shell]$ cat teststdin test [chengmo@centos5 shell]$ cat>teststdin test #ctrl+D #不指定輸入,默認輸入設備就是/dev/stdinn
/dev/stdin指的就是鍵盤設備
[chengmo@centos5 shell]$ cat test.sh >/dev/stdout |grep 'echo' echo "very good!"; echo "good!"; echo "pass!"; echo "no pass!" #/dev/stdout指向就是標準輸出,所以重定向給它的數據,最終發送到屏幕上(fd1) [chengmo@centos5 shell]$ cat test.sh |grep 'echo' echo "very good!"; echo "good!"; echo "pass!"; echo "no pass!"; [chengmo@centos5 shell]$ cat test.sh >/dev/stderr |grep 'echo' #!/bin/sh scores=40; if [[ $scores -gt 90 ]]; then echo "very good!"; elif [[ $scores -gt 80 ]]; then echo "good!"; elif [[ $scores -gt 60 ]]; then echo "pass!"; else echo "no pass!"; fi; #/dev/stderr 指是錯誤輸出,默認也是輸出到屏幕上面,可是它的內容不能經過管道傳遞給grep,管道只能傳遞標準輸出
/dev/null設備
是個黑洞設備,它丟棄一切寫入其中數據,空設備一般被用於丟棄不須要的輸出流。記得當年用windows時候,有個相似的設備:NUL ,跟這個功能同樣。任何寫入該設備數據都會被丟棄掉。從這個裏面讀取數據返回是空。將一些不用內容常常發送給這個設備,丟棄不須要的數據。
如:
[chengmo@centos5 shell]$ cat /dev/null [chengmo@centos5 shell]$ cat test.sh >/dev/null #讀該設備爲空,寫入該設備數據都丟棄了
/dev/zero設備
在類UNIX 操做系統中, /dev/zero 是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。其中的一個典型用法是用它提供的字符流來覆蓋信息,另外一個常見用法是產生一個特定大小的空白文件。
如:
[chengmo@centos5 shell]$ dd if=/dev/zero of=testzero count=1024 bs=1024 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB) copied, 0.0107194 seconds, 97.8 MB/s #建立一個大小爲1M文件,該文件一個塊是1024字節,一共是1024塊(恰好1M),用/dev/zero文件內容填充它。輸出建立到:testzero文件 [chengmo@centos5 shell]$dd if=/dev/zero of=/dev/磁盤分區 #這個命令必定不要隨便用,有點象windows裏面的粉碎文件工具。不過它是用\0x00填充整個分區。這樣作數據是不能夠恢復的了。 [chengmo@centos5 shell]$cat /dev/zero>testinputzero #這個命令也不能隨便使用咯,/dev/zero設備一個特效是,若是你讀取的話,是一個死循環會輸出無窮的\x00,這樣你將建立一個用\x00填充的文件。若是你沒有限制該用戶磁盤配額。它將耗盡整個磁盤空間。
在linux資源配額限制裏面,若是沒有如今普通用戶的磁盤空間利用,或內存使用。一個普通用戶就能夠經過上面方法一會就塞滿整個磁盤。也能夠經過while(true) {fork……}類程序,啓動無限線程,耗盡整個系統內存。
/dev/full設備
類Unix系統中,/dev/full(常滿設備)是一個特殊設備文件,老是在向其寫入時返回設備無剩餘空間(錯誤碼爲ENOSPC),讀取時則與 /dev/zero類似,返回無限的空字符(NULL, ASCII NUL, 0x00)。這個設備一般被用來測試程序在遇到磁盤無剩餘空間錯誤時的行爲。
如:
[chengmo@centos5 shell]$ echo 'chengmo' >/dev/full -bash: echo: write error: 設備上沒有空間 [chengmo@centos5 shell]$ echo $? 1 #命令執行返回錯誤
/dev/random[urandom]
在類UNIX操做系統中,/dev/random是一個特殊的設備文件,能夠用做隨機數發生器或僞隨機數發生器。它容許程序訪問來自設備驅動程序或其它來 源的背景噪聲。經常使用做隨機數發生器。具體參考:linux shell實現隨機數多種方法(date,random,uuid)
/dev/fd
記錄用戶打開的文件描述符
[chengmo@centos5 shell]$ ls /dev/fd/
0 1 2 3
詳細參考:
linux shell數據重定向(輸入重定向與輸出重定向)詳細分析 文件描述符介紹。
/dev/tcp[udp]/host/port
讀取該類形式設備,將會建立一個鏈接host主機port端口的tcp[upd]鏈接。打開一個socket通信接口。
詳細使用能夠參考:
linux shell 腳本實現tcp/upd協議通信(重定向應用)
/dev/loop
在類UNIX操做系統中,Loop設備 能夠把loop 文件,做爲塊設備掛載使用。
如:
[chengmo@centos5 shell]$mount -o loop example.img /home/chengmo/img
#將img鏡像文件掛載到/home/chengmo/img目錄下面,有了這個設備,咱們不須要經過虛擬光驅就能夠讀虛擬磁盤格式的文件。