最近在操作系统的实验课上要求在Linux下实现Shell的简单功能,做了实验感觉挺有收获的,就在这分享一下,欢迎指出问题。
废话不多说,先看main()函数。
1 int main() 2 { 3 char inputBuffer[MAXLINE]; 4 char *argv[MAXLINE/2 - 1]; 5 6 while (1) 7 { 8 printf("COMMAND->"); 9 fgets(inputBuffer,80,stdin); 10 setup(inputBuffer, argv); 11 12 } 13 return 0; 14 }
main函数中,通过fgets(inputBuffer,80,stdin)函数获得用户的输入,并通过setup(inputBuffer,argv)函数分割输入的字串,将命令语句和参数分别提取出来。这里用到了fgets()函数,说一下用fgets(inputBuffer,80,stdin)、gets(inputBuffer)的不同,这会影响到接下来setup函数的写法。
gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加' '字符。注意在c中需要加头文件#include<string.h>,在c++中不需要。
fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加' ',并以str作为函数值返回。
也就是说我们在输入命令行,例如“ls”的时候,输入完之后会按下一个回车执行,用gets的话,那么存在inputBuffer中的字符串为“ls ”换行符是要被丢弃的,但是如果使用fget函数的话,那么读取的字符串为“ls ”,换行符是不会被丢弃的,这一点一定要注意。
接下来看fget函数:
1 //p是一个全局char型指针char *p 2 void setup(char inputBuffer[], char *argv[]) 3 { 4 int i, j; 5 i = 0; 6 for(p = inputBuffer;*p!='