1. 程式人生 > >mybash的實現

mybash的實現

任務詳情

  • 使用fork,exec,wait實現mybash
  • 寫出虛擬碼,產品程式碼和測試程式碼

相關知識

  • shell
    • shell俗稱殼,它是一個命令解析器,是使用者和Linux核心之間的介面程式。
    • 在Linux系統中,使用者可以通過shell輸入命令,shell通過計算機中的的一些程式,將命令轉換成計算機懂的語言,讓計算機執行某種程式。
  • bash
    • 我們可以把shell比作是瀏覽器,而bash是谷歌瀏覽器
    • Linux有各種各樣的shellbash就是其中最為通用的一種
    • bash有很靈活和強大的程式設計介面,同時又有很友好的使用者介面
    • 更多的關於bash部分我在網上查找了很多資料:
  • 實現Mybash
    • 使用man bash檢視
      image
    • 查閱資料我們可知通常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,等資料;  
    使用者輸入命令;  
    建立子程序;
    執行命令;
    等待命令執行結束;
}

程式碼實現

執行截圖

  • 測試:lspwd
  • image

遇到問題及解決方法

  • 在進行編譯時出現
    image

    解決辦法:查閱後發現少了兩個標頭檔案:pwd.hsys/wait.h,程式中需要輸出使用者的虛擬機器的使用者ID等資料,就需要口令檔案pwd.h,在開始就呼叫程序需要程序控制檔案sys/wait.h來提供型別pid_t的定義。