CSC209 系統故障 管道

蝴蝶自由發表於2024-03-19

CSCSHELL截止時間為週日晚上11:59。積分2002月14日後12點開始發售。A3–CSCSHELLCSC209 2024年冬季上次更新(3月15日):見5.7目錄1.簡介2.入門檔案2.1. 實際開始3.CSCSHELL4.限制(shell的東西你不必實現)5.實施和要求5.1. 管理錯誤5.2. 外殼變數5.2.1. 創造5.2.2. 用法5.2.3. 路徑5.2.4. 使用變數賦值進行錯誤檢查5.3. 指令碼和.cscsh_init5.4. 處決5.4.1. cd命令5.5. 檔案重定向5.6. 管道5.7. 註釋和澄清(請檢視此處瞭解任何更新)6.標記1.簡介在最初的幾堂課中,我們一起學習了命令列的基本“語法”。我們聊了一會兒關於終端程式,以及這個叫做BASH的東西,或者更一般地說是shell。在本次作業中,您將實現一個基本的shell,該shell可以執行我們在到目前為止的課程(令我驚訝的是,手冊頁和vi也得到了支援,至少在teach.cs和我的自己的機器)。它將能夠使用系統啟動可執行檔案(具有適當許可權的檔案)在特殊$PATH變數中列出的任何目錄以及具有絕對或相對路徑的任何目錄中找到CSCSHELL2/11(例如,如果您鍵入./hello)當然,您還可以為這些提供命令列引數程式。這個shell將是互動式的,並且可以適度地編寫指令碼。當“互動式”時,鍵入終端程式(本身執行您的shell程式)將向其他正在執行的stdin提供輸入可執行檔案,以及顯示stdout和stderr的輸出。真的,你已經習慣了“命令列”,但由您編寫!最終,它將支援檔案重定向、管道和讀取來自指令碼檔案的命令,因此您不侷限於此shell的互動式使用。雖然我們無法完全支援任何和所有程式代 寫CSC209,也就是說,安裝在teach.cs上(這需要持續的維護和錯誤修復),我們將能夠使用基本系統我們已經學會使用的程式,比如cd(實際上是一種特殊情況)、ls、mkdir、rm、grep、touch、man,cat、wc等——以及您為該課程開發的所有程式。此分配將具有大量的C字串解析、檔案i/o以及系統呼叫的標準用法(族):fork、exec、wait、pipe和dup。2.入門檔案標頭檔案cscshell.h有很多詳細資訊可以幫助您入門。請不要刪除或編輯任何已經存在的內容,但可以隨意新增更多的函式宣告、宏和任何庫不需要連結,可以在teach.cs上找到。不要更改結構定義,測試人員將使用這些定義,所以您只能使用它們。除了cscshell.h,還有附帶的cscshell.c,它具有main()入口點為您的程式。不需要更改此原始檔。如果您這樣做,您只能新增功能,並且不刪除任何現有功能(此外,我們不會測試任何其他功能您新增的功能)。parse.c和run.c檔案是這個賦值的兩個主要部分。您實現的每一項功能應該新增到這兩個檔案中的一個,這取決於它是用於解析shell文字,還是用於執行程序/其他可執行檔案。2.1. 實際開始本作業的系統呼叫方面所需的材料將不會在課堂上介紹,直到第7周和第8周,所以儘快開始解析shell語法(因為您已經你需要的一切),並開始問自己,你需要什麼才能完成剩下的工作。原始檔包括許多附加資訊,旨在引導您成功完成任務,以及一些助手和部分完成的功能。請隨意開始根據cscshell的說法,如果你是那種人的話。3.CSCSHELLCSCSHELL3/11這個shell將類似於POSIX sh(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html)(很像BASH(https://www.gnu.org/software/bash/) ; 你可以在teach.cs機器、Ubunseu或WSL上找到;或zsh(https://wiki.archlinux.org/title/zsh#:~:text=Zsh is a power shell,改進 ab comple; 你可以在你的蘋果產品上找到)。然而,我們將保持它的深度簡化,重點關注以下功能:1.註釋:任何一行後面跟著#字元的內容都是註釋,因此被忽略2.變數分配和使用。見5.2。3.指令碼執行,包括一個強制性的init指令碼,該指令碼最初必須在某個點4.cd命令,因為這不是可執行檔案,它是由shell提供的系統控制訪問5.使用系統呼叫啟動具有任意字串引數的可執行檔案。程式是的第一部分CSCSHELL的任何可用行(前提是它不是cd、變數賦值或註釋),並且可以在${PATH}目錄中找到的名稱,或者程式的明確路徑(相對或絕對均可接受)。6.檔案從stdout重定向到新的(或重新建立現有的)檔案或附加到現有檔案,如以及從檔案重定向到stdin7.一個程式的標準輸出和下一個程式標準輸入之間的管道連線。所有程序都必須執行同時4.限制(shell的東西你不必實現)即使是最基本的POSIX sh(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html)支援更多的功能,事實上,它是一種相當全面的指令碼語言。我們不會實現除了3中列出的功能之外的任何功能。一些明顯的侷限性:1.不支援元字元/匹配,例如“*”2.迴圈、條件語句、通用程式設計指令碼功能3.指令碼的命令列引數(如果沒有2,則有些毫無意義。)4.重定向到/帶有檔案描述符編號(透過shell語法)5.命令歷史記錄和選項卡完成此外,只有一個環境變數($PATH)是相當有限的,因此維護變數作為連結串列。如果你真的很喜歡這項工作,我建議用一些如果你想鍛鍊的話,這些缺失的功能。5.實施和要求5.1. 管理錯誤CSCSHELL4/11由系統故障引起的錯誤,例如malloc記憶體不足,應該會導致shell終止然而,與CSCSHELL的使用有關的錯誤應該得到妥善處理結束shell時,這些應該只列印一條錯誤訊息。標題cscshell.h列出了各種當出現問題時,要列印到stderr的帶有(格式化)字串的宏。您可以在中找到示例關於如何使用它們,特別是使用ERR_PRINT。如果您無法決定使用哪個錯誤,使用通用錯誤:#define ERR_EXECUTE_LINE“無法執行行。\n”更新:您可以使用ERR_PRINT宏中的任何錯誤訊息來透過自動測試。對於使用哪條訊息,不必有任何混淆。請注意,好的資訊會對您有所幫助除錯。5.2. 外殼變數5.2.1. 創造外殼變數必須指定為名稱,僅由字母字元和組成_(下劃線)字元。變數值是一個可以包含任何ASCII字元的字串。請注意,行的換行符不是變數值的一部分。單個=必須將變數名和值分隔開,名稱之間不能有空格和變數值中可以有空格,該值也可以為空(無,或只是'=''後面的空白)。這意味著您可能還會發現額外的空白,包括“\t”(當使用fgets讀取輸入時,'\n'和'\r'會變得混亂,所以我們會放鬆這一點,而不必擔心)。不需要從值中刪除此空白。一些極端但正確的變數作業可能如下所示:PATH=某些文字,其中肯定包含空格。OTHER_VAR=示例具有特殊(選項卡)空白。EMPTY_VAR_ONE=EMPTY_VAR_TWO=注意:EMPTY_VAR_TWO實際上有一些空格作為值,EMPTY_VARS_ONE沒有,突出顯示使用游標填充空白,以便更清楚地檢視。以下是一些不正確分配的示例:BAD_VAR2=名稱中有一個數字Badvar=等號之前不應該有空格。這是非常錯誤的,希望原因很清楚!注意:引用將被簡單地假設為字串的一部分,希望能讓您的工作更輕鬆。因此,在本例中:OTHR_VAR=“你好世界”CSCSHELL5/11變數的名稱是OTHR_VAR,它的值包括引號,儲存:“helloworld”(13字元–以及作為C字串的空終止符)。最後,請注意,如果您鍵入文字轉義序列“\t”或“\n”,則它們被解釋為兩個字元,但由於我們在這個shell中不使用TAB進行自動完成,因此使用TAB鍵將為您提供“\t”字元,形式是插入一個大空格(和C字元值“\t”)。返回參考OTHR_VAR以上。5.2.2. 用法澄清(2004年3月):在本分配中,變數只能用於命令,如中所示,在建立過程中不考慮使用(不需要支援$VAR=使用一些$OTHER值,如果您願意,您可以支援它)。1.簡單shell中的變數用法包括在變數名稱之前加字首的$。如:SPECIAL_FILE=/etc/passwordecho“檔案:$SPECIAL_file並不真正存在。”注意:如果您想將變數與有效變數的符號組合在一起,這是不明確的字元。由於空間的原因,變數的末尾很清楚,但請考慮:PROJECT_DIR=a3/解決方案/

相關文章