shell是Unix/Linux中的重要工具,用来解析用户输入的命令。下面我们来实现一个简单的shell程序,来练习fork/exec/wait/exit的使用,顺便推荐一本书籍《Understanding Unix/Linux Programming - A Guide to Theory and Practice》,这本书写的非常好,适合Unix/Linux系统编程初学者使用。
下面是我们shell的主程序:
1 int main(void) 2 { 3 char *cmdline; 4 char *prompt; 5 char **arglist; 6 int result; 7 8 prompt = PROMPT; 9 signal(SIGINT, SIG_IGN); 10 signal(SIGQUIT,SIG_IGN); 11 12 while ((cmdline = next_cmd(prompt, stdin)) != NULL) { 13 if ((arglist = split_line(cmdline)) != NULL) { 14 result = execute(arglist); 15 freelist(arglist); 16 } 17 free(cmdline); 18 } 19 20 return 0; 21 }
其中,next_cmd()函数的主要功能是从输入流中读入下一个命令,碰到文件结束符返回NULL。下面是该函数的代码:
1 char *next_cmd(char *prompt, FILE *file) 2 { 3 char *cmdline; 4 int length = 0; 5 int c; 6 int location = 0; 7 8 printf("%s", prompt); 9 10 while ((c = getc(file)) != ' ') { 11 if (location + 1 >= length) { 12 cmdline = (char *)malloc(BUFSIZ); 13 length = BUFSIZ; 14 } 15 else if (location >= BUFSIZ) { 16 cmdline = realloc(cmdline, length + BUFSIZ); 17 length += BUFSIZ; 18 } 19 cmdline[location++] = c; 20 } 21 cmdline[location] = '