MIT 6.s081 实验解析——labs1
make qemu
./grade-lab-util <文件名>
//以sleep为例
./grade-lab-util sleep
?? 第一个实验虽然简单,但可以通过这个程序来了解整个命令的运行过程。我们将sleep命令编译入系统之后,在shell里输入sleep 10,shell接受到这段参数之后,进行判断,这是一个程序调用的指令。
//sh.c对应源码
case EXEC:
ecmd = (struct execcmd*)cmd;
if(ecmd->argv[0] == 0)
exit(1);
exec(ecmd->argv[0], ecmd->argv);
fprintf(2, "exec %s failed\n", ecmd->argv[0]);
break;
可以看到在shell的内部,将第一个参数作为文件名,第二个参数作为接受参数,通过exec系统调用对应程序,这才进入到我们自己写的sleep程序中运行。注意:是将整个argv[]传给了sleep,包括argv[0]。
sleep程序很简单,当参数不为2时,直接警告参数错误,并exit(1)退出。当参数正确时,用atoi函数将字符串转为int,然后直接使用sleep系统调用,最后exit(0).
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int main(int argc,char* argv[]){
if(argc!=2){
fprintf(2,"error,please input correct time");
exit(1);
}
sleep(atoi(argv[1]));
exit(0);
}