前面我们写了一个简单的Shell,这个Shell能够接收用户的命令并运行命令。不过这个Shell有个不足就是用户输入命令的时候不能一次输入全部的命令,只能把命令和参数分开输入。这样子对用户极不友好,下面我们就来解决这个问题,方法就是添加命令行解析的功能。命令行解析功能说白了就是解析字符串,把字符串中包含的命令和参数分开,放入字符数组中,作为execlp系统调用的参数。为了实现这个功能,我们需要一个接受用户输入的命令行参数的函数,一个将命令行分解成参数数组的函数。下面是程序主函数:
下面就分别来解说这三个函数:
1、next_cmd()函数从输入流中读入下一个命令,它调用malloc来分配内存以接受任意长度的命令行。碰到文件结束符,它返回NULL。
2、splitline()函数将一个字符串分解为字符串数组,并返回这个数组。它调用malloc来分配内存以接受任意 个数参数的命令行。这个数组由NULL标记结束,是execute()函数的输入。
3、execute()函数使用fork、execvp和wait来运行一个命令,返回命令的结束状态。
下面是程序运行结果和源码:
点击此处下载ash.c (文件大小:4K)