实现一个自己的shell程序,这个程序有这些功能:解释执行命令,支持输入输出重定向,支持管道,后台运行
程序。当运行该程序后,它支持以下的命令格式:
1.单个命令,如:ls。2.带l到多个参数的命令,如ls -l。3.带一个输出重定向的命令。4.带一个输入重定向的
命令。5.带一个管道的命令。6.后台运行符&可加在各个命令的最后面。7.输入exit或logout退出myshell。
错误处理:1.输入错误的命令格式报错。2.输入不存在的命令报错。
程序主函数的流程图如下:
程序的各个函数的功能及说明:
(1)void print_prompt():该函数只是简单地打印myshell的提示符,即“myshell$”。
(2)void get_input(char *buf):获得一条用户输入的待执行命令,参数buf用于存放输入的命令。如果输入的
命令过长(大于256个字符),则终止程序。输入的命令以换行符' '作为结束标志。
(3)void explain_input(char *buf,int *argcount,char arglist[100][256]):解析buf中存放的命令,把每个
选项存放在arglist中。
(4)do_cmd(int argcount,char arglist[100][256]):执行arglist中存放的命令,arglist为待执行命令的参数
的个数。
(5)int find_command(char *command):功能是分别在当前目录下、/bin、/usr/bin目录下查找命令的可执行程
序。
下面是该程序的源代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <fcntl.h> #include <sys/stat.h> #include <dirent.h> #define normal 0 //一般的命令 #define out_redirect 1 //输出重定向 #define in_redirect 2 //输入重定向 #define have_pipe 3 //命令中有管道 void print_prompt(); //打印提示符 void get_input(char*); //得到输入的命令 void explain_input(char*,int*,char a[][256]); //对输入命令进行解析 void do_cmd(int,char a[][256]); //执行命令 int find_command(char*); //查找命令中的可执行程序 int main(int argc,char *argv[]) { int i; int argcount= 0; char arglist[100][256]; char *buf= NULL; char **arg= NULL; buf= (char*)malloc(256); if(buf == NULL) { perror("malloc failed"); exit(-1); } while(1) { memset(buf,0,256); //将buf所指向的空间清零 print_prompt(); get_input(buf); //若输入的命令为exit或logout则退出本程序 if(strcmp(buf,"exit ")== 0||strcmp(buf,"logout ")== 0) break; for(i= 0;i< 100;i++) { arglist[i][0]= '