本地小测试均未发现问题,先放提交测试现状(在重测后第一个点变成了1/6)
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 [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 [0] Running 0x00003005 sleep 10& [1] Running 0x00004808 sleep 60& [0000580a] destroying 0000580a [0000580a] free env 0000580a i am killed ...
$ [00003005] destroying 00003005 [00003005] free env 00003005 i am killed ... jobs [0] Done 0x00003005 sleep 10& [1] Running 0x00004808 sleep 60& [00006005] destroying 00006005 [00006005] free env 00006005 i am killed ...
$ kill 1 [00006805] destroying 00004808 [00006805] free env 00004808 [00006805] destroying 00006805 [00006805] free env 00006805 i am killed ...
$ jobs [0] Done 0x00003005 sleep 10& [1] Done 0x00004808 sleep 60& [00007005] destroying 00007005 [00007005] free env 00007005 i am killed ...
$ kill 0 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: (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 2 [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)
{{{(>_<)}}}