构造一个自己的 mini 操作系统
任务描述
请实现如下功能: 1.写一个命令解释器程序 mysh.c
,其功能是接收用户输入的命令并给出反馈。要求该程序既支持内部命令 cd、sync、exit
;也支持外部命令,即可以接收 cat、ls
等命令,然后执行相应的可执行程序。要求首先在 Ubuntu 中测试该程序,然后用版本 0 内核启动 bochs 虚拟机,在该虚拟机中编译运行该程序,画面应如下图所示:
2.在 bochs 虚拟机的 /etc/rc
文件中增加一组测试命令,如下图所示:
相关知识
为了完成本关任务,你需要掌握: 1.命令解释器程序的一般结构是怎样的; 2.如何获取当前目录的路径名; 3.如何实现内部命令 cd 和 sync ; 4.如何执行一个可执行文件; 5.如何将文件放入 bochs 虚拟机; 6.在 bochs 虚拟机中如何编辑文件。
实验准备
mysh.c
存放在/data/workspace/myshixun/exp3
中,修改之后请将文件保存在同一位置,否则评测无法通过。
实验过程及答案
实验过程
先通过vscode编辑mysh.c
#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { int size = 20; int pid; char pos[size]; char command[size]; while(1) { getcwd(pos,size); printf("%s$\n",pos); scanf("%s",command); if(!strcmp(command,"cd")) { char path[size]; scanf("%s",path); chdir(path); } else if(!strcmp(command,"sync")) { sync(); } else if(!strcmp(command,"exit")) { exit(0); } else if(!strcmp(command,"ls")) { char ls_command[size]; strcpy(ls_command,"ls "); strcat(ls_command,pos); // sprinf(ls_command,"ls %s", pos); system("ls"); } else if(!strcmp(command,"cat")) { char filename[size]; char cat_command[size]; scanf("%s",filename); strcpy(cat_command,"cat "); if(filename[0] != '/') { strcat(cat_command,pos); strcat(cat_command,"/"); } strcat(cat_command,filename); // sprintf(cat_command,"cat %s/%s",pos, filename); system(cat_command); } } }
把这份代码保存到os/linux-0.11-lab/b下
代码搞定,把这段代码放进内核编译