shlab测试笔记
记录每个测试文件的测试目的和怎样使用命令行完成该测试内容。
1.常用指令
1.1 使用测试文件测试tshref
make rtest01
1.2 使用测试文件测试tsh
make test01
1.3 使用命令行测试tsh/tshref
1.3.1 测试tsh
./tsh
1.3.2测试tshref
./tshref
1.4 测试文件提到的信号转化为键盘输入
- EOF:ctrl+d
- SIGINT:ctrl+c
- SIGTSTP:ctrl+z
2. 测试文件
在这个模块中,所有的测试对象都是tshref,如果想测试tsh,只需要对照前面写的指令修改即可。
2.1 trace.01
2.1.1 测试目的
测试读取EOF指令
2.1.2使用命令行测试
-
进入tshref
-
传入EOF信号
Ctrl+d(类似于ctrl+c是复制快捷键,ctrl+d相当于传入一个EOF信号) -
测试结果
2.2 trace.02
2.2.1 测试目的
测试quit指令
2.2.2使用命令行测试
- 运行tshref
./tshref
- 输入quit指令
quit
- 如果跳出tshref说明有quit指令,如果没有跳出说明没有这个指令
2.3 trace.03
2.3.1 测试目的
测试能否运行一个前台作业
2.3.2 使用命令行测试
- 运行tshref
./tshref
- 运行一个前台作业(myspin的功能是使计算机睡眠,后面的数字是睡眠的时间,单位是秒)
./myspin 7
- 如果运行前台作业后等待指定的时间后才出现下一行tsh>,则说明可以运行一个前台作业,如果没有等待指定的时间立刻出现下一行说明这个程序不能运行一个前台作业
2.4 trace.04
2.4.1 测试目的
测试能否运行一个后台作业
2.4.2 使用命令行测试
- 运行tshref
./tshref
- 输入一条后台作业指令(在指令后加&表示在后台运行)
./myspin 5 &
- 正确结果:出现一条带有作业号的作业信息
2.5 trace.05
2.5.1 测试目的
测试jobs指令(打印所有后台作业)
2.5.2 使用命令行测试
-
运行tshref
./tshref
-
运行一条后台作业
./myspin 45 &
-
再次运行一条后台作业
./myspin 56 &
-
输入jobs指令,打印所有后台作业(只会打印正在运行的后台作业,如果运行的后台作业睡眠时间设置的很短,可能在执行jobs指令时已经将后台作业执行完毕,此时已经完成的后台作业不会出现在jobs打印的后台作业列表中)
2.6 trace.06
2.6.1 测试目的
向前台作业发送SIGINT信号
2.6.2 使用命令行测试
- 运行tshref
./tshref
- 运行前台作业
./myspin 32
- 在前台作业执行完之前键入ctrl+c(发送信号SIGINT),终止当前前台作业
2.7 trace.07
2.7.1 测试目的
只向前台作业发送信号SIGINT
2.7.2 使用命令行测试
- 运行tshref
- 执行前台作业
./myspin 34
- 键入ctrl+c(发送信号SIGINT)
- 执行后台作业
./myspin 34 &
- 输入jobs指令,打印出作业列表中显示只有前台作业被终止,后台作业还在正常执行
jobs
2.8 trace.08
2.8.1 测试目的
只向前台作业发送信号SIGINT
2.8.2 使用命令行测试
同2.7.2
2.9 trace.09
2.9.1 测试目的
测试指令bg(重新启动停止运行的作业并在后台运行)
2.9.2 使用命令行测试
- 运行tshref
- 执行前台作业
./myspin 6
- 在前台作业执行完之前,键入ctrl+z停止正在执行的前台作业(发送信号SIGTSTP)
- 输入指令jobs,可以看到当前前台作业已经被停止
jobs
- 输入指令bg,后面的参数是想重启的进程的编号
或者bg %1
bg 2485
- 结果显示已经被停止的前台作业重启并在后台运行
2.10 trace.10
2.10.1 测试目的
测试指令fg(重启已经被停止的进程并在前台运行)
2.10.2 使用命令行测试
-
运行tshref
-
执行前台作业
./myspin 7
-
在前台作业执行完之前,键入ctrl+z停止作业执行
-
输入指令fg+进程号
fg %1
或者
fg 2488
-
结果显示已经被停止的进程被重启并在前台执行
2.11 trace.11
2.11.1 测试目的
向前台进程组中所有进程发送SIGINT信号
2.11.2 使用命令行测试
- 运行tshref
- 执行前台作业
./mysplit 4
- 在前台作业执行完之前,键入ctrl+c终止这个前台作业
- 使用ps查看所有进程的状态
/bin/ps a
- 结果,看到进程表中没有进程号为2653的进程,因为这个进程是被终止。
2.12 trace.12
2.12.1 测试目的
向前台进程组中所有进程发送SIGTSTP信号
2.12.2 使用命令行测试
- 运行tshref
- 执行前台进程
./myspin 4
- 在前台进程完成之前,键入ctrl+z
- 输入jobs指令,打印所有后台进程,显示出已经被停止的前台作业
jobs
- 使用ps查看所有进程列表,显示被停止的前台作业的进程号,并且进程状态是stop,因为进程只是被暂时中止,没有被彻底停止
/bin/ps a
2.13 trace.13
2.13.1 测试目的
重启进程组中所有被停止的进程
2.13.2 使用命令行测试
2.14 trace.14
2.14.1 测试目的
测试简单的错误处理(处理方式:不执行错误指令,并打印“指令错误”)
2.14.2 使用命令行测试
2.15 trace.15
2.15.1 测试目的
发送信号到进程的混合命令
2.15.2 使用命令行测试
2.16 trace.16
2.16.1 测试目的
测试shell能否处理来自其他进程的SIGINT信号和SIGTSTP信号
2.16.2 使用命令行测试
3. 验收提问的问题
- 怎样实现waitfg函数
使用一个while循环,如果不是前台作业则死等,是前台作业则跳出循环。 - wait_pid(pid_t pid,int status,int options)的三个参数分别是什么含义;
第一个参数pid是要等待的进程号,如果pid=-1则不等待指定的进程号,只要有一个进程结束就结束等待;
第二个参数status,如果不为空则将子进程的中止状态存入status指向的位置,如果为空则表示父进程不关心子进程;
第三个参数options标识要等待的子进程的状态;