mybash的實現
阿新 • • 發佈:2018-11-25
任務詳情
- 使用fork,exec,wait實現mybash
- 寫出虛擬碼,產品程式碼和測試程式碼
相關知識
shell
shell
俗稱殼,它是一個命令解析器,是使用者和Linux核心之間的介面程式。- 在Linux系統中,使用者可以通過
shell
輸入命令,shell
通過計算機中的的一些程式,將命令轉換成計算機懂的語言,讓計算機執行某種程式。
bash
- 我們可以把
shell
比作是瀏覽器,而bash
是谷歌瀏覽器 - Linux有各種各樣的
shell
,bash
就是其中最為通用的一種 bash
有很靈活和強大的程式設計介面,同時又有很友好的使用者介面- 更多的關於
bash
部分我在網上查找了很多資料:
- 我們可以把
- 實現
Mybash
- 使用
man bash
檢視
- 查閱資料我們可知通常
shell
中執行命令的流程都是bash
程序建立了一個子程序,然後子程序程序替換,替換為可執行的命令檔案。 fork
:- 這個英文單詞在英文裡是"分叉"意思,它通過系統呼叫建立一個與原來程序幾乎完全相同的程序,一個是子程序,一個是父程序。
- 在子程序中,
fork
函式返回0,在父程序中,fork
返回新建立子程序的程序ID。 - 可以通過
fork
返回的值來判斷當前程序是子程序還是父程序。
exec
:- 是一組函式的統稱,引數可以分成3個部分:執行檔案部分、命令引數部分、環境變數部分
exec
函式會取代執行它的程序, 也就是說, 一旦exec
函式執行成功, 它就不會返回了, 程序結束. 但是如果exec
函式執行失敗, 它會返回失敗的資訊, 而且程序繼續執行後面的程式碼- 通常
exec
會放在fork()
函式的子程序部分, 來替代子程序執行啦, 執行成功後子程式就會消失, 但是執行失敗的話, 必須用exit()
函式來讓子程序退出
wait
- 父程序呼叫wait函式可以回收子程序終止資訊
pid_t wait(int *status)
: 成功:清理掉的子程序ID;失敗:-1 (沒有子程序)
- 使用
虛擬碼
while(1)
{
輸出使用者的ID,等資料;
使用者輸入命令;
建立子程序;
執行命令;
等待命令執行結束;
}
程式碼實現
執行截圖
- 測試:
ls
、pwd
遇到問題及解決方法
在進行編譯時出現
解決辦法:查閱後發現少了兩個標頭檔案:
pwd.h
和sys/wait.h
,程式中需要輸出使用者的虛擬機器的使用者ID等資料,就需要口令檔案pwd.h
,在開始就呼叫程序需要程序控制檔案sys/wait.h
來提供型別pid_t的定義。