HNU计算机系统实验shlab1&shlab2

mac2026-09-27  11

此为本人在进行实验时所做的实验日志,仅供参考。

1、学会编译tsh.c,调用tsh文件traceXX.txt的功能验证方法: 通过make clean和make指令来对tsh.c文件进行编译,如果没有语法错误将会如上图所示,编译成功。 在tracexx.txt文件中都是一条一条已经写好的命令行语句,将会通过文件流输入的方式给予我们写好的shell代码,然后与给的tshref运行结果进行比较,如果相等则说明我们的代码是正确的。 通过“make 跟踪文件”来对我们编写的tsh.c文件进行测试(如上左图),正确的标准结果可以通过“make r跟踪文件”来对老师给的tshref可执行文件进行测试(如上右图),如果相同则证明代码正确,实验成功。

2、用trace01和trace02比较tsh和tshref执行结果并分析: trace01.txt跟踪文件是执行close和wait命令行语句,最终的结果表示可以正确读出跟踪文件中的数据,然后在读取close的时候,关闭文件,并等待(在执行的时候并没有出现太长时间的停顿),表示正确。 trace02.txt跟踪文件是执行quit和wait命令行语句,由于这个时候tsh.c文件并没有进行编写修改,所以tsh.c文件中没有对应quit命令行语句的函数,所以没有执行,也没有退出,停留在等待输入命令行语句的界面,而tshref执行文件的结果是在遇到quit语句后直接退出shell

3、编程实现quit内置命令,补齐文件tsh.c中的函数eval()和函数builtin_cmd()与quit相关的部分: 学习现有代码可以了解到主函数main中在满足条件时:没有输入结束命令行ctrl-d之前,都会调用一个eval()函数,而函数的参数就是我们输入的命令行,所以如果想要实现quit语句,我们就需要先将eval函数写出来。从网上和书上查找了相应的代码后得到自己的成功代码如下: 同时,我们需要在eval函数中调用builtin_cmd函数,这个函数的作用是判断是否是内置命令行语句,通过strcmp进行比较,如果是则进行相应的操作,函数的参数也应该是我们输入的命令行,由此也可以得到builin_cmd函数如下: 这里我的理解是这样的:首先通过之前写好的parseline()函数得到输入的命令行,然后调用builtin_cmd函数进行判断,如果输入的是内置命令行则将会返回0,如我们输入quit,会与quit相同,所以不会执行exit(0)函数,直接返回0,再进行取反后进入if语句内部执行。 执行时进行判断并打印结果,然后执行exit(1)函数结束进程。

4、使用trace03验证quit命令 我们可以使用trace03.txt文件查看代码是否正常运行,trace03跟踪文件的内容如下: 如果能够正常运行,首先会打印出上述的文字,然后执行quit语句,标准结果如下: 我得到的结果如下: 可以看到完全一致,说明代码运行正确。

5、了解eval()与execve执行流程和fork()多进程运行方式 exec*库函数在加载一个可执行文件的时候,先生成预处理文件.cpp(把include文件包含进来进行宏替换)、编译成汇编代码.s、编译成目标代码,得到二进制文件.o、再链接成可执行文件、最终运行。 在linux系统中,除了系统启动之后的第一个进程由系统来创建,其余的进程都必须由已存在的进程来创建,新创建的进程叫子进程,而创建子进程的进程为父进程。在系统启动及完成初始化之后,linux自动创建的进程叫做根进程。根进程也就是最初的父进程。linux中父进程荣国分裂的方式来创建子进程,创建一个子进程的系统调用叫做fork(),fork函数创建进程的实质是子进程对父进程的复制。

最新回复(0)