shell 多程序
一、檔案描述符
1)檔案描述符是一個非負整數,而核心需要通過這個檔案描述符才可以訪問檔案。當我們在系統中開啟已有的檔案或新建檔案時,核心每次都會給特定的程序返回一個檔案描述符,當程序需要對檔案進行讀或寫操作時,都要依賴這個檔案描述符進行。檔案描述符就像一本書的目錄頁數(也叫索引),通過這個索引可以找到需要的內容。在Linux或類UNIX系統中核心預設會為每個程序建立三個標準的檔案描述符,分別是0(標準輸入)、1(標準輸出)和2(標準錯誤)。通過檢視/proc/PID號/fd/目錄下的檔案,就可以檢視每個程序擁有的所有檔案描述符。
建立檔案描述符的語法: exec 檔案描述符<>檔名 呼叫檔案描述符語法:&檔案描述符 關閉檔案描述符語法: exec 檔案描述符<&- 或者 exec 檔案描述符>&-
定時檔案描述符時> 和 < 判斷檔案描述符用於輸入還是輸出,如果此時只有用其中一個,那就是單工通訊的。
2)read 可以從檔案描述符中讀取資料
read -u12 content
檔案描述符並不是簡單地對應一個檔案的。檔案描述符中還包含有很多檔案相關的資訊,如許可權、檔案偏移量等。檔案偏移量更像一個指標,它指向某個檔案的位置,預設情況下該指標指向的是檔案的起始位置,當使用read命令讀取一行資料後,該指標會指向下一行資料,再使用read讀取一行內容,指標再往下移動一行,依此類推,直到檔案結束。
因為cat命令會讀取檔案的全部內容,所以當我們使用cat命令讀取檔案描述符時,檔案描述符的指標會一次性跳到檔案的末尾,一旦到了檔案末尾,則再通過檔案描述符讀取檔案的內容就為空,因為沒有內容可讀了。但是可以重新開啟檔案描述符,還可以再次從開始位置讀取資料內容。
同樣的道理,也可以每次僅讀取檔案的任意個字元。這樣的話,指標就會停留在特定字元的後面,等待下一次再通過檔案描述符讀取檔案內容時,就會繼續從這個位置讀取後續的內容。read命令可以通過-n選項指定讀取任意字元的資料。
二、命名管道
管道是程序間通訊的一種方式,前面已經介紹了匿名管道,使用|符號就可以建立一個匿名管道,顧名思義,系統會自動建立一個可以讀寫資料的管道,但是這個管道並沒有名稱。一個程式往管道中寫資料,另一個程式就可以從管道中讀取資料。但是匿名管道僅可以實現父程序與子程序之間的資料交換,能不能實現任意兩個無關的程序之間的通訊呢?答案是肯定的,使用命名管道,也叫FIFO檔案。
命名管道具有如下幾個特徵:
● FIFO檔案由命令建立(mknod或mkfifo命令),可以在檔案系統中直接看到。
● 寫入管道的資料一旦被讀取後,就不可以再重複讀取。
● 程序往命名管道中寫資料時,如果沒有其他程序讀取資料,則寫程序會被阻塞。
● 程序嘗試從命名管道中讀取資料時,如果管道中沒有資料,則讀程序會被阻塞。
● 命名管道中的資料常駐記憶體,並不實際寫入磁碟,讀寫效率會更高。
三、多程序指令碼
參考: linux shell核心程式設計指南 ,有需要的朋友可以自行閱讀。