这个任务需要我们拿到command的返回值,然而我们的command遇到问题直接user_panic了,出错时的返回值不详。
因此,我们目前的指令似乎没有能返回错误码的,需要我们修改所有command以使其能返回错误码吗,如果是,我们应该返回什么错误码
最后修改于:
最后回复于:
回复主题帖
是的,所有command都需要能够返回值表示是否成功执行,但是并不对返回的错误码做要求,也即如果成功则返回0,否则返回非0值即可。
最后修改于:2024-06-10 16:55:42
那这样的话,我能直接删了原来的panic改成print加return r吗
我正试图直接从command进程的v0寄存器取出返回结果然后ipc发回父进程,这样有可行性吗
最后修改于:2024-06-10 17:08:24
那这样的话,我能直接删了原来的panic改成print加return r吗
可以的。
我正试图直接从command进程的v0寄存器取出返回结果然后ipc发回父进程,这样有可行性吗
这也是可以的,可以在exit
函数中传入返回值参数,然后通过ipc返回给父进程再结束。
最后修改于:2024-06-10 17:16:49
请问评测的时候会检查user_panic输出的panic at吗
最后修改于:2024-06-10 17:27:41
需要补充说明下,指导书中对于新增的指令中有错误输出的要求,比如touch
和mkdir
等指令,其他MOS原有指令并不需要考虑错误输出,如有问题欢迎再次提出。
最后修改于:2024-06-10 18:08:43
现在还是在实现这个exit返回值的功能,我和同学都遇到了同一个症状的bug:
管道符右侧指令输入错误会整个MOS都卡死
,左侧输错和单条指令输错均不会。
我的实现是在exit里进程destroy前用ipc_send发同步消息,在wait()函数里用ipc_recv接收消息。
4005号进程是ls指令的子shell,4086号进程是ca(错误指令)的shell,上图waiting处是debug信息(见下),但是令人疑惑的是完全不知道4005号进程为什么会在开始执行ls前发生wait以及没有收到消息他为什么会继续向下运行到红框处。
最后修改于:2024-06-10 20:50:36
4005号进程为什么会在开始执行ls前发生wait以及没有收到消息他为什么会继续向下运行到红框处。
你的实现为:
4005 waiting
表达的应该是有进程在等待4005
进程发送消息。然后后面的4005 spawn ls: started
应该才是4005进程的spawn输出。
管道符右侧指令输入错误会整个MOS都卡死
,左侧输错和单条指令输错均不会。
可以考虑一下进程在wait和exit使用ipc通信,进程与fs进程也是使用ipc进行通信,ipc对进程状态的设置对进程调度队列的影响以及进程调度队列的执行。
需要注意fs进程运行一个时间片其实最多只能解决一个请求。
这里卡死的原因应该是4806子进程结束返回的1到了4005进程spwan函数调用open函数进而调用fsipc_map
函数的ipc_recv,导致open返回1,可是spawn中如果open返回值小于0才会返回该返回值,所以会使用readn
读取二进制文件ls.b的内容,但是由于4806进程使用ipc_send时,并没有使用srcva映射到4005进程在fsipc_map
中设置的dstva,导致readn函数此时访问空地址,从而卡死。
由于没有直接代码,我猜测原因是这样,如有疑问或者错误欢迎提出。
最后修改于:2024-06-11 01:13:39
万分感谢,确实是收发消息的问题
对终止消息采用了一些新的ipc设计后彻底解决
ヾ(≧▽≦*)o
最后修改于:2024-06-11 12:12:21
请问挑战性任务的“自动化评测”是如何进行的,以及我们在最终提交前能否看到自动化评测的结果?
最后修改于:2024-06-10 20:30:22
类似于课下的测试,大概会在一周之后开放。
最后修改于:2024-06-10 23:02:05
请问现在开放的shell自动测试的形式是怎样的。
我已实现前两个测试点要求的内容(条件执行与三个新增指令)。
自己验证了&&与||的逻辑基本没有问题,为何所有点都无法通过测试呢?
(手搓测试见下)
(无论是带不带那些调试信息(destroying env
等)均无法通过任何测试点
ps:我修改了init.c
,使得启动可以通过make && make run
,应该无伤大雅。
最后修改于:2024-06-12 23:57:33
评测的方式与之前lab6 shell的课下测试相同;测试中可能会出现文件名中不带.b的可执行文件,可以检查下自己这一部分的实现。
最后修改于:2024-06-13 00:50:55
应该不是这个问题,上面自测的图里用的就都是没有.b的指令
另外,能确保1,2测试点不依赖3,4,5吗
最后修改于:2024-06-13 09:21:01
如果使用的可执行文件是事先就编译好放在文件系统中,并且本身就不带.b文件后缀名,这种情况也是存在的,不能单纯地在spawn函数中检测.b
并添加后缀。
1,2测试点应该是不依赖后续测试点的。
最后修改于:2024-06-13 10:04:00
请问助教如果可执行文件不带.b的话,这样该如何实现呢?目前没太想到合适的办法.
而且指令名不是固定在include.mk里的嘛
最后修改于:2024-06-13 10:34:10
对于.b
后缀的测试,评测会将直接编译好的不带.b后缀的文件放入文件系统,而非通过mos的编译生成。
最后修改于:2024-06-13 10:59:01
我改成了先尝试读取原指令,如果不行再读取拼接了.b的指令,依然无法通过任何测试点,感到十分疑惑
最后修改于:2024-06-13 12:03:50
可以尝试在编译时开启优化试一下:make MOS_PROFILE=release
,检查下编译时出现的warning。
最后修改于:2024-06-13 12:39:24
警告已经全部消除,但是编译器开启O2时会发生完全无法预测的错误:
1 | int spawn(char *prog, char **argv) { |
最后修改于:2024-06-13 13:08:18
其实可以发现char program[MAXNAMLEN]
这一部分栈空间的作用域在if(fd=open ...)
那个括号里面,所以当出了那个作用域的时候其实那部分内存其实就被释放掉了,这个时候prog指向program再使用的话就成了野指针,可能会出现意料之外的错误,可以尝试把char program[MAXNAMELEN]
放在外面。
最后修改于:2024-06-13 13:19:27
感谢,修改过后第二三个点能对了,但是第一个点仍全0
1 | $ true || echo 1 && echo 2 || false && echo 3 |
自测结果如上,似乎并无问题,我实在找不到问题()>﹏<
最后修改于:2024-06-13 17:22:50
想请问助教各个测试点间的依赖关系是怎么样的
最后修改于:2024-06-13 15:20:46
可以参考下这个,评测基本都对应各自说明的内容。
最后修改于:2024-06-13 16:06:05
请问第一个测试点对touch等自己实现的指令的返回值、实现分号隔开的多个指令有要求吗?
最后修改于:2024-06-14 21:26:19
同学你好,我的理解是第一个测试点不会出现touch等自己实现的指令。
最后修改于:2024-06-15 00:24:36
请问助教
但是评测所给的makefile里面并没有history.b,这是不是意味着正确实现为history.b的办法不可行呢
最后修改于:2024-06-13 10:40:38
已经在指导书中将history.b
指令的描述改为必须实现为内建指令,可以刷新下界面查看。
最后修改于:2024-06-13 10:55:39