【已解决】 shell增强 测试点1,5求助

Nadleeh
🔖︎ 5 订阅
👍︎ 4 点赞

本地小测试均未发现问题,先放提交测试现状(在重测后第一个点变成了1/6) image.png 1号测试点的实现思路是在runcmd外部用一个新的分段器分出来||,&&,;之间的指令以及指令前面的符号,和保存的上一条指令运行结果一起决定是否要fork和runcmd,通过改装的wait接收runcmd的执行结果(原装指令的返回值基本符合linux状况)
测试状况为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ true || echo 1 && echo 2 || false && echo 3 // 执行结果应为 0 || 未执行 && 显示2 || 未执行 && 显示3 ,,对吗? 
[00007805] destroying 00007805
[00007805] free env 00007805
i am killed ...
[00007004] destroying 00007004
[00007004] free env 00007004
i am killed ...
2
[00008805] destroying 00008805
[00008805] free env 00008805
i am killed ...
[00008004] destroying 00008004
[00008004] free env 00008004
i am killed ...
3
[00009805] destroying 00009805
[00009805] free env 00009805
i am killed ...
[00009004] destroying 00009004
[00009004] free env 00009004
i am killed ...

5号测试点是在上述新的分段器上加上了&判断,是&判断就对前一条指令在spawn时就设置后台执行,同时执行它的子shell不进行wait。自测找不到问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
$ sleep 10& //测试挂后台

$ sleep 60&

$ jobs //后台都在running
[0] Running 0x00003005 sleep 10&
[1] Running 0x00004808 sleep 60&
[0000580a] destroying 0000580a
[0000580a] free env 0000580a
i am killed ...

$ [00003005] destroying 00003005 //后台job的env结束的消息送到了
[00003005] free env 00003005
i am killed ...
jobs //输入jobs再次查看状况
[0] Done 0x00003005 sleep 10&
[1] Running 0x00004808 sleep 60&
[00006005] destroying 00006005
[00006005] free env 00006005
i am killed ...

$ kill 1 //测试kill 之前的sleep60&
[00006805] destroying 00004808
[00006805] free env 00004808
[00006805] destroying 00006805
[00006805] free env 00006805
i am killed ...

$ jobs //kill成功
[0] Done 0x00003005 sleep 10&
[1] Done 0x00004808 sleep 60&
[00007005] destroying 00007005
[00007005] free env 00007005
i am killed ...

$ kill 0 //测试kill的错误处理
kill: (0x00003005) not running
[00007805] destroying 00007805
[00007805] free env 00007805
i am killed ...

$ kill 2
kill: job (2) do not exist
[00008005] destroying 00008005
[00008005] free env 00008005
i am killed ...

$ fg 0 //测试fg错误处理
fg: (0x00003005) not running
[00008805] destroying 00008805
[00008805] free env 00008805
i am killed ...

$ fg 2
fg: job (2) do not exist
[00009005] destroying 00009005
[00009005] free env 00009005
i am killed ...

$ sleep 10& //准备测试fg

$ fg 2 //fg 2输入后成功把sleep调入前台,前台在睡眠完成后才恢复(此处需要显示调入的指令吗, fg调入前台后需要删除原来的jobs中它的条目吗)???
[0000a008] destroying 0000a008
[0000a008] free env 0000a008
i am killed ...
[0000b00b] destroying 0000b00b
[0000b00b] free env 0000b00b
i am killed ...

$ QEMU: Terminated
请检查libmain的实现是否正确,因为二进制的false.b似乎会被置换
请检查job是否从1开始计数(XD)
{{{(>_<)}}}
0%