shell说明文档
文档大纲
编译方法
在目录下输入clang -o shell shell.c tool.c command.c mytop.c
即可编译。
输入./shell
即可运行。
支持的功能
内置
Cd/mytop(top)/exit/histoy n
program
管道/重定向/带参数运行的程序。
支持的样例
cd/your/path
ls(-a/-l -a)
ls -a -l > outfile
vi file
grep “parameters” < inputfile
Ls -a -l | grep a
vi file &
mytop
history n
Exit
各文件说明
shell.c
shell函数的主体框架:
1 | int main() |
shell.h
包含函数声明/常数定义/编译所用的头文件
1 |
命令行结构:
1 | struct cmdline |
函数声明:
1 | int issamestring(const char *a,const char *b);/*辅助函数,判断字符串是否相等*/ |
tool.c
包含了解析命令行、判断是否相等字符串、判断是否内置命令、执行命令的函数。
command.c
Shell.h中声明的函数的执行。
program命令
ls/grep
ls/grep两个命令均是对文件IO逻辑的考察,逻辑相同,下以ls为例进行说明。
1 | void exe_ls(struct cmdline oneline){ |
vi and background job
linux的vi file &很奇怪,是通过将子进程的标准输入输出映射到/dev/null实现的。
我自己在minix3环境下实验了一下,发现无论是我自己的shell还是minix3原来的shell,都有如下提示:
Vi's standard input and output must be a terminal
1 | void exe_vi(struct cmdline oneline) |
其余的background文件的实施 需要看父进程是否wait子进程。
redirection
1 | /*管道和重定向*/ |
pipe
pipe的主体框架
1 | /*提取Program A /B,此处同redirection*/ |
mytop命令
mytop框架如下,参照minix3的top.c框架
输出内容:
1. 总体内存大小,空闲内存大小,缓存大小;
2. 总体CPU使用占比。
1 | void exe_mytop(){ |
下面对mytop.c的函数做具体解释,部分宏定义来源于top.c参考源码。
1 | /*在psinfo文件下解析进程*/ |