HNU计算机系统实验shlab3&shlab4

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

一、编程实现eval()的后台作业管理功能并使用trace04验证:
写出来eval的代码如下:

在这里插入图片描述
接下来使用trace04跟踪文件进行测试
trace04跟踪文件为:
在这里插入图片描述
首先打印三行字符串,然后在后台运行myspin函数,计算机沉睡一秒。
验证的结果如下:
在这里插入图片描述
标准结果
先打印三行字符串,然后运行./myspin 1,并通过[1]表示后台运行
在这里插入图片描述
测试结果
和标准结果一模一样,证明成功。

二、学习trace测试文件符号(空格、&、#等)、命令、用户程序myspin含义:
这里为了测试,我将trace01.txt进行了修改,并尝试着进行了测试。
空格表示分隔(这个不需要,也没有办法进行测试);
&表示后台运行,如果命令行以符号&结束,那么TSH应该在后台运行job。否则,它应该在前台运行作业,具体测试结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到尽管两句代码完全一样,只不过是换了顺序,但运行的结果完全不同。第一个先在后台运行./myspin用户程序,然后再直接运行myspin用户程序,所以会先有一个[1]的出现,表示在后台正在运行一个程序,这个程序为./myspin 1 &,然后再有一个./myspin 1;而第二个就颠倒了过来。
%表示接下来的是job ID;
#表示打印#后面的一行数据,具体测试结果如下:
在这里插入图片描述
在这里插入图片描述
命令有系统命令(用户自己写的c语言代码实现的命令)和内置(内建)命令(linux系统自动支持的命令):
tsh应该支持的内建命令有如下几条:
1)quit(终止shell)
2)jobs(展示所有后台作业)
3)bg(重新启动某个job并在后台运行)
4)fg(重新启动某个job并在前台运行);
系统命令实际上就是所写的用户程序myint、myspin、mysplit、mystop,下面进行解释:
myint程序为一个c语言代码,用法是myint ,用途是测试我们的shell,实际上实现的是睡眠函数的功能,让程序睡眠n秒,运行结束后不会自动退出,并会检测系统错误;
myspin程序为一个c语言代码,用法是myspin ,用途是测试我们的shell,实际上实现的是睡眠函数的功能,程序睡眠n秒,在睡眠结束后就自动退出,不检测系统错误;
mysplit程序为一个c语言代码,用法是mysplit ,用途是测试我们的shell,实际上实现的是睡眠函数的功能,程序睡眠n秒,但它是创建一个子进程进行睡眠,然后父进程等待子进程正常睡眠n秒后,继续运行;
mystop程序为一个c语言代码,用法是mystop ,用途是测试我们的shell,实际上实现的是让进程暂定n秒,并发送信号。

三、编程实现jobs内建命令,使用trace05验证:
想要实现内建命令需要从builtin_cmd函数入手,只要通过strcmp函数进行比较然后调用listjobs函数就可以实现当输入job指令的时候运行成功。代码如下:
在这里插入图片描述
trace05文件为:
在这里插入图片描述
首先打印三行字符串,然后在后台运行myspin函数,计算机沉睡两秒,然后后台运行myspin函数,计算机沉睡三秒,然后展示所有的后台作业。
测试的结果如下:
在这里插入图片描述
标准结果
在这里插入图片描述
测试结果
可以看到尽管有的部分参数是有区别的(这是因为机器本身),其余是相同的,所以证明结果正确。

©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页