• 大小: 13KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: C/C++
  • 标签: C语言  myshell  

资源简介

基本功能: 1.基本的内部命令。如:cd, ls, pwd 等; 2.能处理后台程序(不需要wait) 3.具有管道和重定向功能。如输入:who | wc -l 进行测试; 4.可以处理多条命令,以';'分隔, 滤掉无效的空格、tab符等;

资源截图

代码片段和文件信息

////////////////////////////////////////////////////////////////////
/*******************************************************************
MyShell 1.0 Copyright @ fc 2011

功能说明:

1.基本的内部命令。如:cd ls pwd 等;

2.能处理后台程序(不需要wait)

3.具有管道和重定向功能。如输入:who | wc -l 进行测试;

4.可以处理多条命令,以‘;‘分隔 滤掉无效的空格、tab符等;
*******************************************************************/
////////////////////////////////////////////////////////////////////


#include 
#include 
#include 
#include 
#include 
#include 
#include 


//子函数声明 
char *get_input();                  //获取用户的输入
int  count_command(char *input);    //统计命令数量
char **get_command(char *input);    //分离出每条命令 
int  count_pipe(char *command);     //统计管道数量 
int  do_pipe(char *command);        //管道处理
int  redirect(char *command);       //重定向处理
int  count_argv(char *command);     //统计参数个数 
char **get_argv(char *command);     //分离出参数
char *get_com_path(char *command);  //获得命令路径 


//主程序 
int main() 
{
    int  i num;
    char *input **command;

    //清屏并显示版本信息
    system(“clear“);
    printf(“*********************************\n“);
    printf(“ MyShell 1.0 Copyright @ fc 2011\n“);
    printf(“*********************************\n“);

    while(1)
    {      
        //显示当前路径
printf(“%s:$ “ getcwd(NULL0));

//获取用户的输入
        input=get_input();
if(input==NULL) continue;

//统计命令数量,以‘;‘分隔
        num=count_command(input);
        if(num==0) continue;

//分离出每条命令 
command=get_command(input);

//处理每条命令 
for(i=0; i {     
       //检查命令中是否有管道符号
    if(count_pipe(command[i])) 
                do_pipe(command[i]);
    else     
                redirect(command[i]);
}

//释放申请的内存空间
for(i=0; i     free(command[i]);
free(command);
free(input);
    }

    return 0;
}


//获取用户的输入
char *get_input() 
{
    int i;
    char *input;
    
    if((input=(char *)malloc(100*sizeof(char)))==0)
    {
        perror(“malloc“);
return NULL;
    }

    for(i=0; i<100; i++)
    {
        input[i]=getchar();
        
        if(input[i]==‘\n‘)
        {
            input[i]=‘\0‘;
            break;
        }
    }
            
    //输入的内容过长 
    if(i==100)
    {
printf(“input too long!\n“);
return NULL;
    }

    return input;
}


//统计命令数量
int count_command(char *input)
{
    int i num=0;
    int len=strlen(input);

    for(i=0; i        if(input[i]!=‘ ‘&&input[i]!=‘ ‘)
    break;

    //输入中有语法错误 
    if(input[i]==‘;‘)
    {
printf(“syntax error!\n“);
return 0;
    }

    //输入中只有空格或TAB
    if(i==len) return 0;

    for(i=0; i    {
if(input[i]==‘;‘)
{
    for(i++; i                if(input[i]!=‘ ‘&&input[i]!=‘ ‘)
    break;
           
            //输入中有语法错误  
            if(input[i]==‘;‘)
    {
printf(“syntax error!\n“);
return 0;
    }
    else num++;
        }
    }

    return ++num;
}  


//分离出每条命令
char **get_command(char *input)
{
    char **command;
    int i j 

评论

共有 条评论