zoukankan      html  css  js  c++  java
  • Linux下模拟实现shell

    模拟实现shell的源代码

    include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<sys/fcntl.h>
    #include<sys/wait.h>
    
    int main()
    {
        while (1)
        {
            printf("[test@nihao test]$ ");
            fflush(stdout);
    
            char buf[1024];
            ssize_t s = read(0, buf, sizeof(buf)-1);
            if (s > 0)
            {
                buf[s-1]= 0;
            }
            char *_myshell[32];//指针数组(也便于后面程序替换)
            char* start = buf;
            _myshell[0] = start;
    
            int i = 1;
            while (*start) //将每一个指令让指针数组指向
            {
                if (*start == ' ')
                {
                    *start = 0;
                    start++;
                    _myshell[i++] = start;
                }
                start++;
            }
            _myshell[i] = NULL;
    
            if (strcmp(_myshell[0], "exit") == 0)
            {
                break;
            }
    
            if (strcmp(_myshell[i-2], ">") == 0)//输出重定向
            {
                _myshell[i - 2] = NULL;
                pid_t id = fork();
                if (id < 0)
                {
                    perror("fork error!");
                }
                else if (id == 0)//child
                {
                    close(1);
                    open(_myshell[i-1], O_WRONLY|O_CREAT, 0666);
                    execvp(_myshell[0], _myshell);
                }
                else
                {
                    wait(0);
                }
            }
            else  //正常指令
            {
                _t id = vfork();
                if (id < 0)
                {
                    perror("vfork");
                }
                else if (0 == id)
                {
                    execvp(_myshell[0], _myshell);//替换
                }
                else
                {
                    wait(0);
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    修改文件小练习
    登录、注册、删除小练习
    自动生成用户名和密码
    自动生成密码文件
    监控日志被攻击情况-小练习
    随机函数_手机自动生成小练习
    as与c++的反射机制对比
    as中的陷阱
    关于as中的事件与回调函数
    身份证号码验证
  • 原文地址:https://www.cnblogs.com/chan0311/p/9427350.html
Copyright © 2011-2022 走看看