1. 程式人生 > 其它 >BUAA_OS lab0實驗報告

BUAA_OS lab0實驗報告

一、思考題

1.思考0.1

通過你的使用經驗,簡單分析 CLI Shell,GUI Shell 在你使用過程中的各自優劣(100 字以內)

CLI:優點:介面簡潔;編寫程式方便;無需載入圖形等內容效能更高;只需要鍵盤就能實現所有功能,對外部裝置要求低;批量操作時更方便(rm -rf/)。缺點:學習成本高;有時無法直觀看到操作結果;介面單調。

GUI:優點:介面美觀且更直觀;可以直接看到操作結果(比如刪除檔案);入門門檻低;可配合多種外設使用。缺點:執行效率較低;穩定性較差。

2.思考0.2

使用你知道的方法(包括重定向)建立下圖內容的檔案(檔案命名為test),將建立該檔案的命令序列儲存在command檔案中,並將test檔案作為批處理檔案執行,將執行結果輸出至result檔案中。給出command檔案和result檔案的內容,並對最後的結果進行解釋說明(可以從test檔案的內容入手)具體實現的過程中思考下列問題:echo Shell Start 與 echo 'Shell Start'效果是否有區別;echo $c>file1 與 echo '$c>file1' 效果是否有區別

command檔案內容:

echo echo Shell Start... > test
echo echo set a = 1 >> test
echo a=1 >> test
echo echo set b = 2 >>test
echo b=2 >> test
echo echo set c = a+b >> test
echo c=\$[\$a+\$b] >> test
echo echo c = \$c >> test
echo echo save c to ./file1 >>test
echo echo \$c\>file1 >>test
echo echo save b to ./file2 >>test
echo echo \$b\>file2 >>test
echo echo save a to ./file3 >>test
echo echo \$a\>file3 >>test
echo echo save file1 file2 file3 to file4 >>test
echo cat file1\>file4 >>test
echo cat file2\>\>file4 >>test
echo cat file3\>\>file4 >>test
echo echo save file4 to ./result >>test
echo cat file4\>\>result >>test

result檔案內容:

3
2
1

test檔案中$字元用於引用變數,如 c=$[$a+$b]中,取a和b的值相加後賦值給c。在echo c時輸出字元c,而echo $c時則輸出c的值。

echo Shell Startecho 'Shell Start'執行效果沒有區別,均是輸出字串;echo \$c>fileecho '\$c>file1'執行效果不同,前者是輸出字串$c到file1,而後者是在視窗中顯示字串\$c>file1

3.思考0.3

仔細看看這張圖,思考一下箭頭中的 add the file 、stage the file 和commit 分別對應的是 Git 裡的哪些命令呢?

add the file對應git init

stage the file對應git add

commit對應git commit

4.思考0.4

  • 深夜,小明在做作業系統實驗。睏意一陣陣襲來,小明睡倒在了鍵盤上。等到小明早上醒來的時候,他驚恐地發現,他把一個重要的程式碼檔案printf.c刪除掉了。苦惱的小明向你求助,你該怎樣幫他把程式碼檔案恢復呢?

    從暫存區中找回該檔案

    git checkout -- printf.c
  • 正在小明苦惱的時候,小紅主動請纓幫小明解決問題。小紅很爽快地在鍵盤上敲下了git rm printf.c,這下事情更復雜了,現在你又該如何處理才能彌補小紅的過錯呢?

    將最近一次commit版本中的該檔案拉取到暫存區,之後再從暫存區找回該檔案

    git reset HEAD --printf.c
    git checkout --printf.c
  • 處理完程式碼檔案,你正打算去找小明說他的檔案已經恢復了,但突然發現小明的倉庫裡有一個叫Tucao.txt,你好奇地開啟一看,發現是吐槽作業系統實驗的,且該檔案已經被新增到暫存區了,面對這樣的情況,你該如何設定才能使Tucao.txt在不從工作區刪除的情況下不會被git commit指令提交到版本庫?

    編輯.gitignore檔案,將Tucao.txt新增進去(可以用vim編輯)

    vim .gitignore

    將暫存區的Tucao.txt刪除

    git rm Tucao.txt

5.思考0.5

思考下面四個描述,你覺得哪些正確,哪些錯誤,請給出你參考的資料或實驗證據。

  1. 克隆時所有分支均被克隆,但只有HEAD指向的分支被檢出。

  2. 克隆出的工作區中執行 git log、git status、git checkout、git commit等操作不會去訪問遠端版本庫。

    正確。

  3. 克隆時只有遠端版本庫HEAD指向的分支被克隆。

    正確。

  4. 克隆後工作區的預設分支處於master分支。

    正確。

依據來自Git官網:

Clones a repository into a newly created directory, creates remote-tracking branches for each branch in the cloned repository (visible using git branch --remotes), and creates and checks out an initial branch that is forked from the cloned repository’s currently active branch.

—— Git官網

二、實驗難點

1.task5

task5中要求將檔案批量重新命名,一開始我想到了rename命令但不會使用,於是到CSDN搜尋用法,按照提示嘗試寫出命令(與題目要求不完全相同)

i=1
while [ $i -le 70]
do
rename file newfile ./file$i
let i+=1
done

但並不能執行,可能是因為./file$1被當作了正則表示式匹配,後來換成./file/$i'./file$i'"./file$i"都不行,遂放棄。

後來發現可以直接使用 mv命令實現重新命名(把原檔案重新命名後作為新檔案移動到原目錄)

然而又發現變數自增不會寫,於是通過CSDN瞭解到五種變數自增方法:

i='expr $i + 1'   #注意i與=之間不能有空格,$i + 1三者之間必須有空格
let i+=1
((i++))
i=$[$i+1]
i=$(($i + 1))

2.task8

本題難點在於檔案產生的相互依賴與邏輯,我的思路如下圖:

我認為可以逆向思考,要在csc資料夾中獲得fibo檔案,Makefile中的目標即為fibo,而依賴為fibo.o和main.o,但這兩個檔案應該位於code資料夾中,於是二者的產生邏輯均為進入code資料夾,然後make編譯產生..o檔案,此處也要注意產生.o檔案時還需要依賴code資料夾的兄弟資料夾include中的fib.h標頭檔案。

本題的另一個難點在於“連結”,當在一個資料夾中編譯時需要呼叫某不在此資料夾中檔案,此時需要告訴編譯器去哪裡找到這個檔案。比如在最後生成fibo檔案時需要code資料夾中的兩個.o檔案,此時這兩個.o檔案應帶有相對路徑,否則無法找到。

csc資料夾中Makefile:

all:fibo
fibo:fibo.o main.o
gcc -o fibo code/fibo.o code/main.o
fibo.o main.o:
cd code && make
PHONY:clean
clean:
cd code && make clean

code資料夾中Makefile:

all: fibo.o main.o
fibo.o:fibo.c fibo.h
gcc -c -I ../include fibo.c #包含標頭檔案
main.o:main.c fibo.h
gcc -c -I ../include main.c
.PHONY:clean
clean:
rm fibo.o main.o

三、體會與感想

本次作業耗時約9小時(主要是學習新內容),儘管寒假學習了vim和一些基本的命令列操作,但事實上還有更多我沒有見過的東西,做作業的時候有種連滾帶爬的感覺,基本上是靠著CSDN苟活下來的。

比如grep、sed之類的命令,感覺確實很有體系,但經常記不住什麼命令什麼選項什麼引數放在哪裡,或許還是應該多加練習,希望熟能生巧。

也可能是因為在虛擬機器上,不能直觀地看到想要的東西,而且不太熟悉Git的相關操作,也就不敢過於放肆地嘗試(比如在Windows系統上我就可以大膽地在git資料夾裡亂改一棄,改錯了直接把本地克隆的倉庫扔進回收箱再次clone...或許在虛擬機器上也可以這麼幹,但還不敢)。

很多命令經過親自嘗試的學習會發現記憶能更加深刻,我想這樣大膽嘗試的底氣應該來自我對git能幫我回到完好無損(除了rm -rf(bushi))的相信,所以當務之急還是儘快熟悉Git關於“時空穿梭”的相關功能,還是要牢牢掌握基本工具的使用啊。

四、指導書反饋

基礎操作介紹一節的最後位置,題目問到在已分屏視窗間切換的快捷鍵,在當時做題時一方面前兩題排除了AB選項,另一方面教程中介紹了ctrl+b 0的作用,於是理所當然選了C。但後來我才發現這一問中是小寫o,檢索發現原來ctrl+b o也是一個有作用的快捷鍵。我認為在教程前面補上ctrl+b o可以使教程更完備,或許也可以讓同學們注意到這一點,而不是像我這樣矇混過關險些沒有學到這一快捷鍵的作用。

五、殘留難點

1.git的一個問題

在某次git add .之後我試圖用git status檢視哪些檔案做了修改,但發現介面報出了這樣的提示:

事實上在這之後每次都會有一長串這樣的提示(儘管如此,正常的commit和push還能進行),我不知道這是否是因為我誤刪了什麼東西,還是對.gitignore有了什麼操作,這一問題到現在還沒有得到解決(討論區的問題並沒有收到回覆)。

2.Makefile的一個問題

在task8中需要makefile連結其他資料夾中的依賴檔案,通過CSDN我瞭解到可以通過VPATH的設定使makefile自動在設定的目錄中搜索依賴檔案,於是在做題時我使用了VPATH=code:..\include這樣的路徑,但程式報錯“無法找到xxx檔案”。我不知道這是什麼原因,是用法出現了問題?還是對VPATH作用的理解有誤?我還沒有得到回答(同理,檢索沒有獲得答案,討論區也還沒有得到對這個問題的回覆)。

附上我檢索到的VPATH用法: