實現自主shell

本文將編寫一個程序,當程序跑起來時,可以輸入linux下的相關命令,然後程序也會返回相應命令的結果。

具體實現代碼如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>  //isspace

int main()
{
    char buf[1024] = {}; 
    while(1)
    {   
        pid_t id = fork();
        if(id == 0)//child
        {   
            char* my_arg[32];
            printf("myshell>");
            fgets(buf,sizeof(buf),stdin);
            buf[strlen(buf)-1] = 0;
            char* p = buf;
            int i = 1;
            my_arg[0] = buf;
            while(*p)
            {   
                if(isspace(*p))
                {   
                    *p = 0;
                    p++;
                    my_arg[i++] = p;
                }
                else
                {
                    p++;
                }
            }
            my_arg[i] = NULL;
            execvp(my_arg[0],my_arg);
        }
        else
        {
            int status = 0;
            pid_t ret = waitpid(id,&status,0);
            if(ret > 0)
            {
                //printf("%d\n",status&0X7F);
            }
            else
            {
                printf("waitpid runnning error\n");
            }
        }
    }
                    p++;
                    my_arg[i++] = p;
                }
                else
                {
                    p++;
                }
            }
            my_arg[i] = NULL;
            execvp(my_arg[0],my_arg);
        }
        else
        {
            int status = 0;
            pid_t ret = waitpid(id,&status,0);
            if(ret > 0)
            {
                //printf("%d\n",status&0X7F);
            }
            else
            {
                printf("waitpid runnning error\n");
            }
        }
    }
                    p++;
                    my_arg[i++] = p;
                }
                else
                {
                    p++;
                }
            }
            my_arg[i] = NULL;
            execvp(my_arg[0],my_arg);
        }
        else
        {
            int status = 0;
            pid_t ret = waitpid(id,&status,0);
            if(ret > 0)
            {
                //printf("%d\n",status&0X7F);
            }
            else
            {
                printf("waitpid runnning error\n");
            }
        }
    }
    return 0;
}

運行結果如下:

但是代碼還是有缺陷,輸入命令若是輸錯時,不能刪除,只能重新輸入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章