lab0——初识操作系统

实验思考题

思考0.1

通过你的使用经验,简单分析 CLI ShellGUI Shell 在你使用过程中的各自优劣(100 字以内)

GUI界面清晰且易于理解,不需要太多专业知识的人也可以轻松使用,但是操作时无法得知背后的具体实现原理是什么。

CLI通过命令行控制程序,控制更为细致和具体,但是不经过相应学习和训练无法掌握如何使用。

思考题 0.2
使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为test),将创建该文件的命令序列保存在command文件中,并将test文件作为批处理文件运行,将运行结果输出至result文件中。给出command文件和result文件的内容,并对最后的结果进行解释说明(可以从test文件的内容入手) 具体实现的过程中思考下列问题:echo echo Shell Start与 echo 'echo Shell Start'效果是否有区别 echo echo $c>file1 echo '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

直接执行echo echo Shell Start与 echo 'echo Shell Start'效果没有区别

把这两条语句的结果写入test.txt也没有区别

但是把两条语句的结果写入test结果不同,

一个写入echo Shell Start一个写入'echo Shell Start'

echo echo \$c>file1 是把echo $c的内容写入file1

echo 'echo \$c>file1'是把echo $c>file1输出到屏幕

思考题 0.3

仔细看看这张图,思考一下箭头中的 add the file 、stage the file 和commit 分别对应的是 Git 里的哪些命令呢?

add the file 对应 git init

stage the file对应git add

commit 对应git commit

思考题0.4

深夜,小明在做操作系统实验。困意一阵阵袭来,小明睡倒在了键盘上。等到小明早上醒来的时候,他惊恐地发现,他把一个重要的代码文件printf.c删除掉了。苦恼的小明向你求助,你该怎样帮他把代码文件恢复呢?

git checkout --<file>

正在小明苦恼的时候,小红主动请缨帮小明解决问题。小红很爽快地在键盘上敲下了git rm printf.c,这下事情更复杂了,现在你又该如何处理才能弥补小红的过错呢?

git reset HEAD <file>

git checkout --<file>

·处理完代码文件,你正打算去找小明说他的文件已经恢复了,但突然发现小明的仓库里有一个叫Tucao.txt,你好奇地打开一看,发现是吐槽操作系统实验的,且该文件已经被添加到暂存区了,面对这样的情况,你该如何设置才能使Tucao.txt在不从工作区删除的情况下不会被git commit指令提交到版本库?

git checkout --<file>

vim .gitignore中添加Tucao.txt

思考题0.5

# git clone 用于从远程仓库克隆一份到本地版本库
$ git clone git@os-git.cscore.net.cn:学号-lab

思考下面四个描述,你觉得哪些正确,哪些错误,请给出你参考的资料或实验证据。

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

节选自官网

Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 `

  1. 克隆出的工作区中执行 git loggit status、*git checkout、git commit等操作不会去访问远程版本库。

正确 因为已经全都拉取下来了

  1. 克隆时只有远程版本库HEAD指向的分支被克隆。

错误

  1. 克隆后工作区的默认分支处于master分支。

正确

实验难点图示

本次实验主要在第八个任务卡了很久,实验总时长接近7个小时,里面可能有三四个小时以上都是耗费在这个上面,现在仍然存在一些困惑。

最早的版本没有读懂题目的意思,以为是在code里make两个.o文件再在csc里make出fibo,所以虽然本地运行正确但是评测一直不对(提示找不到fibo.c)这里我现在还是没理解,感觉如果没有在code里make,运行make fibo应该提示我找不到main.o和fibo.o才对(如下)

经过助教的提醒我尝试通过csc里的make调用子目录下的make,我按照助教所说的使用了

cd code && make fibo.ocd code && $(MAKE) fibo.o均以失败告终

下图是根据网上查到的用法做出的尝试,仍然失败了

最后问了大佬才算做对一次,是把fibo生成的任务完全交给code里的make实现,外层的make只调用内层make(如下)

但是折腾了一晚上加一上午,最后发现居然外层的make就没啥意义,感觉心里很不服气,而且怀疑肯定有从外层调用子文件的内容make的方法,所以又尝试出了第二个版本

如图所示非常麻烦,不过起码让我把折磨我这么长时间的诸多问题想明白了

  1. 依赖关系部分写的文件A,要和命令中出现的A名称保持一致,和下文A依赖的其他文件的描述也要保持一致
  2. 需要使用的.h文件通过 -I 和相对路径引入即可 在依赖关系中可以省略
  3. 需要哪里的文件make就最好在那个目录下完成make,不然加路径太过繁琐

前面的任务中对于sed和awk的使用也遇到了一些问题。最不能理解的就是为什么在博客园或者CSDN上搜到别人的解决方案,明明问题描述是类似的,我运行类似的代码却得不到相同的结果。

体会与感想

本次实验学习时间加实战时间超过10个小时,被很多无法理解的错误折磨得身心俱疲,似乎其他同学完成的要更轻松一些,按理说lab0不应该如此痛苦。

一方面确实要反省假期预习的工作不够到位,另一方面也是因为着急oo没有第一时间开始lab0,错过了和同学们在群里讨论的机会。前者已经没法弥补,不过后者可以以后注意。

完成之后回过头来看,其实lab0的难度并不高,主要还是自己相关只是太过缺乏,加之学习缺少章法造成的。大部分时间都在 缺乏宏观思路的情况下瞎尝试,也因此浪费了很多时间,(但我确实在很多情况下不知道为什么自己会错

指导书反馈

对于grep awk sed等命令和shell运行的的机制还不是特别理解

对于文件来说shell是对于每一行执行一次吗?上述指令的返回结果是一行还是多行?

(可能现在也不是特别确定...)

还有对于makefile所需的文件如果不在一个文件该如何处理,似乎在指导书上也没有提及

虽然说很多知识指导书没有写到也可以自己百度,但是感觉搜到的结果质量参差不齐,还是有一点浪费时间

posted @ 2020-08-26 09:45  bl水滴  阅读(1490)  评论(0编辑  收藏  举报