第18章 終端I O

2021-07-05 18:27:26 字數 3912 閱讀 1709

在我們設定定時任務的時候經常會使用標準輸出和標準錯誤輸出。這個在linux是乙個非常重要的概念,而且這個很有用。程式應該有資料庫的**端、資料的目的端,以及報告問題的地方,它們被稱為標準輸入、標準輸出以及標準錯誤輸出。

程式啟動的時候,預設情況下,標準輸出、輸入都會已經開啟,且已準備好供其使用。我們使用xshell連線並登陸上伺服器的時候,預設下終端就是標準輸入、輸出端。可以試試cat命令。

$ cat

#未指定任何的引數是,讀取預設的標準輸入、寫入到預設的標準輸出

建華是可以玩耍的小夥伴 #使用者輸入(此時終端預設是標準輸入)

建華是可以玩耍的小夥伴 #程式將內容輸出到標準輸出(此時終端預設為標準輸出)

^d #輸入ctrl-d 告訴程式檔案結尾

重定向與管道

shell提供了數種語法,可以修改預設的io的**端和目的端,就是標準輸入和輸出的地方。

<

修改標準輸入

sort < ucid.txt

預設下,標準輸入為終端,此時可以更改為你想要的地方

<<

command << delimiter

從標準輸入中讀入,直到遇到delimiter分割符

>

修改標準輸出

ls -l > listinfo.txt

預設下,標準輸出為終端,此時可以修改預設輸出的地方。譬如可以將標準輸出的內容寫在檔案中。

如果檔案已存在,會被覆蓋掉。

>>

輸出附件到檔案

ls -l >> listinfo.txt

與[>]不一樣的是,[>]會清空原來的內容,而[>>]只是將標準輸出追加到檔案結尾處。

|建立管道

program1 | program2

1. program1的標準輸出為program2的標準輸入;

2. 管道的執行效率比使用臨時檔案的程式起碼高乙個數量級;

[

場景:對檔案內容的資訊進行排序

[nemo@name tool]$ cat

show.txt

7291418

2233803

8031001

1258962

[weiyg@name tool]$

sort

1258962

2233803

7291418

8031001

[>]例子

場景:列印內容到檔案

[weiyg@name script]$ ll

total

20-rw-rw-r--. 1 weiyg weiyg 254 dec 31

13:45

ssh.rb

-rw-r--r--. 1 weiyg weiyg 476 dec 30

11:48

sshx.rb

-rw-rw-r--. 1 weiyg weiyg 12 dec 26

16:57

test.rb

[weiyg@name script]$

ls -l >listinfo.txt

[weiyg@name script]$

catlistinfo.txt

total

20-rw-rw-r--. 1 weiyg weiyg 0 jan 22

21:35

listinfo.txt

-rw-rw-r--. 1 weiyg weiyg 254 dec 31

13:45

ssh.rb

-rw-r--r--. 1 weiyg weiyg 476 dec 30

11:48

sshx.rb

-rw-rw-r--. 1 weiyg weiyg 12 dec 26

16:57 test.rb

在定時任務上面經常使用。因為定時任務執行的內容,不會列印到終端。如果需要檢視結果的話就很麻煩。而列印到檔案中的話,隨時都可以檢視了。不過這裡往往用[>>]追加比較多。

[>>]例子

沒啥好說的,跟[>]就是乙個[>]會覆蓋原有的檔案,而[>>]只是追加。

[|]管道例子

場景:查詢id為19217***x的玩家在1月15日使用道具的日誌

[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 |grep

'19217***x

'1389717003317|19217***x|2|304|305|0|

1389717005097|19217***x|2|303|304|0|

這是查詢遊戲日誌的乙個例子。預設下,系統會將遊戲5天前的日誌進行打包壓縮。而此時需要查詢5天前的日誌的話,使用上面的方法無論在效率上還是方便上,管道都有使用臨時檔案無法比擬的又是。當然使用下面的方法:

[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 >tem.log

[weiyg@name flash]$

grep

'19217***x

'tem.log

1389717003317|19217***x|2|304|305|0|

1389717005097|19217***x|2|303|304|0|

也可以達到相同的結果,但相比使用管道,一、需要使用臨時檔案,讀寫在磁碟需要時間;二、臨時檔案還需要手動刪除,比較麻煩。

注:bzcat 可以直接顯示壓縮檔案的內容

特殊檔案:/dev/null 與/dev/tty

/dev/null  傳送到此檔案的資料都會被系統丟掉,,就是輸出到乙個空裝置的意思。

/dev/tty   程式開啟此檔案時,linux會自動將它重定向到乙個終端。

檔案描述符

在定時任務,我們經常在重定向的時候,喜歡這樣操作。

33

1 * * * /home/weiyg/crontab/clear_logs.sh > /dev/null

2>&1

後面的 2>&1是什麼意思呢,這裡就要理解檔案描述符和繫結重定向的概念了。

檔案檔案描述符

輸入檔案——標準輸入

0(預設為終端(網上有說預設為鍵盤的))

輸出檔案——標準輸出

1(預設為終端)

錯誤輸出檔案——標準錯誤

2(預設為終端)

繫結重定向

commond >&m

標準輸出重定向到檔案描述符m中

command

關閉標準輸入

command 0>&-

關閉標準輸出

此時我們再去理解[2>&1],就容易多了。[2]是標準錯誤的檔案描述符,而[>&1]的意思重定向到標準輸出。那麼定時任務的解釋就是,將[clear_logs.sh]執行的標準輸出和標準錯誤重定向到[/dev/null](就是丟掉輸出的內容)。

我是這樣理解(不一定正確)上面的定時任務的(分2部分):

clear_logs.sh > /dev/null

#將clear_logs.sh執行的標準輸出輸出到/dev/null

clear_logs.

sh2> /dev/null

#將clear_logs.sh執行的標準錯誤輸出到/dev/null,只是clear_logs.sh不是執行了2次,只是1次。這裡的&1代表的就是/dev/null

第18章 網路程式設計

第18章 網路程式設計 計算機上面可以安裝非常多的應用軟體,那麼如何區分這些軟體?需要通過埠號來區分,埠號,相當與房子中開的們.一 埠號在計算機裡面有2個位元組那麼大,因此埠號的取值範圍 0 65535 共65536個 但是1024以下的埠號,通常是計算機內建軟體埠 類似於現實生活中的短號號碼 12...

第3章 緩衝I O

1.在核心中,所有的檔案系統操作都是基於塊來執行的。實際上,塊是i o中的基本概念。因此,所有i o操作都是在塊大小或者塊大小的整數倍上執行。也就是說,也許你只想讀取乙個位元組,實際上需要讀取整個塊。額外的系統呼叫所帶來的開銷會導致操作效能急劇下降。例如,要讀取1024個位元組,如果每次讀乙個位元組...

第3章 檔案I O

引言unix系統中的大多數檔案i o 只需要用到5個函式 open read write lseek以及close 檔案描述符 用於描述檔案開啟或者建立之後返回的乙個非負整數,可以理解為檔案的id 特殊用途的標號 0 標準輸入 1 標準輸出 2 標準錯誤 早期系統一般乙個程序最多開啟16個檔案,現在...