2013年8月18日 星期日

Linux note(3)

原本只是想寫有關socket的shell script,沒想到最基本的檔案觀念建立的不夠周全,需要好好的紀錄一下

觀念一

從鳥哥網站上看到: 任何裝置在linux下都是檔案,連資料溝通的介面也有專屬的檔案在負責!啥意思呢?剛開始看還不太懂,"裝置"?其實就是字面上的意思,例如鍵盤裝置在linux下會有專屬的檔案來負責,讓鍵盤裝置和linux可以互相溝通。然而溝通的方式是如何呢?在survey後才了解到是利用file descriptor來識別檔案,這又是啥意思,舉例來說:平常寫python時,讀檔的時候常用到

myfile = open("fileName",'r')

從上面的python code可以知道我們打開了一個檔案,但是在linux下到底是怎麼開檔的?其實就是給該file一個號碼(file descriptor),讓程式知道要對該檔案作操作,基於這種想法,如果我們要對某裝置ex:鍵盤,進行操作,那就對鍵盤負責則的檔案,給予一個號碼,那麼我們就可跟該裝置作溝通惹!!ex:常常聽到redirection這個字,又0代表鍵盤輸入,啥意思呢?其實就是鍵盤負責input的file descriptor識別碼是0啦!這樣我們就可以對鍵盤這個file作操作惹!!

Linux下的檔案種類
正規檔案(regular file) 一般的純文字檔,二進位檔,資料格式檔都屬於此類
目錄(directory) 一般目錄,基本上也是為檔案
連結檔(link) 跟windows的捷徑概念相同
設備與裝置檔(device) 與系統周邊及儲存等相關的一些檔案,有兩種block device(硬碟),character device(鍵盤)
資料接口檔(sockets) 這種類型的檔案通常被用在網路上的資料承接
資料輸送檔(FIFO, pipe) 主要的目的在解決多個程序同時存取一個檔案所造成的錯誤問題

觀念二

重新導向(redirection): 之前一直傻傻以為重新導向的目的只是把螢幕上顯示的東西寫到資料夾中,或是把資料夾內的檔案變成某一個指令的input,實際上"導向"的意思是對某個file作IO的操作,ex:一般的鍵盤輸入就是程式和file descriptor 0的導向操作,重新導向指的是我們把鍵盤file的操作導向換到其他file的意思!! ex:把原本的鍵盤輸入改成某個txt檔,這是我們最常看到的方式,但是也可以換成某serial port file的導向方式,讓外部的設備藉由serial port(ex:usb)變成某個程式的input!!

# txt檔當input
$ ./myProcess < input.txt
# serial port當input
$ ./myProcess < /dev/tty0

觀念三

/proc資料夾: 此資料夾為一個虛擬的檔案系統,此資料夾下的所有檔案都在memory中,不會佔有任何disk上的空間,此外,當開啟新的shell之後,可以在該資料夾下發現與shell的pid相同的資料夾,代表該shell process的file,驗證方式:

# 在終端機先開啟新的分頁
# 可以看到該shell的pid
echo $$

# 搜尋/process下是否有該shell process的資料夾
ls /proc | grep $$ 

觀念四

exec: 此指令其實有一個家族,不過沒寫果系統程式,所以每個exec系列的function都沒用過QQ,不過沒關係,觀念四只想說明exec是用來替換某個process,ex:

exec ls

上面的指令在shell中輸入之後會馬上把shell process給關掉,然後執行ls這個process,原因在於exec的特性是把process給"替換掉",在系統程式中常會fork搭配exec,利用parent process fork產生child process,然後child process執行exec,然後child會被自己呼叫的exec給帶換成其他的process的想法相同。 此外,exec還有一向功能是和某file產生file descriptor的連結,ex:

$ exec 3< input.txt
$ read var <&3
上面的指令使input.txt為輸入導向,file descriptor = 3,然後只要指定 <&3即可當作input
重要IO導向
> 把輸出重新導向到某個file中(記住linux中所有的裝置都是file)
>> 把輸出用append的方式重新導向某個file
< 重新導向input到其它的file
>&n 把standard out丟給file descriptor n
<&n 從file descriptor n拿東西給standard in
>&- close standard out
<<text 把stanadard in導向,直到讀到某text為止
example:(socket to connect google)
#!/bin/bash
exec 5<>/dev/tcp/www.google.com.tw/80
echo -e "GET / HTTP/1.0\n" >&5
cat <&5

參考資料

沒有留言:

張貼留言