• 编程实现linux下的shell


    /*************************************************************************
        > File Name: Kris_shell.c
        > Author: KrisChou
        > Mail:zhoujx0219@163.com 
        > Created Time: Thu 21 Aug 2014 04:31:55 PM CST
     ************************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    #define PROMPT ">>" 
    #define ARG_CNT 32
    
    void command_to_arglist(char** arglist,char *cmd_line);
    
    int main(int argc, char *argv[])
    {
        char cmd_line[1024];
        char *arglist[ARG_CNT];
        while(memset(cmd_line,0,1024), printf("%s",PROMPT), fgets(cmd_line,1024,stdin))
        {
            if(cmd_line[0] != '
    ')
            {
                cmd_line[strlen(cmd_line) - 1] = ''; //将读进来的换行符变成''
                command_to_arglist(arglist,cmd_line);
                if(fork() > 0)
                {
                    wait(NULL);
                }else
                {
                    execvp(arglist[0],arglist);
                    exit(0);
                }
            }
        }
        return 0;
    }
    
    static int my_isspace(char c)
    {
        if(c == ' '|| c == '
    ' || c == '	' || c =='v')
            return 1;
        else
            return 0;
    }
    
    static void command_to_arglist(char** arglist,char *cmd_line)
    {
        int cnt = 0;
        int bg,end;
        bg = 0;
        while(cmd_line[bg] != '')
        {
            while(my_isspace(cmd_line[bg]))
            {
                bg++;
            }
            if(cmd_line[bg] == '')
            {
                break;
            }
            end = bg;
            while(cmd_line[end] != '' && !my_isspace(cmd_line[end]))
            {
                end++;
            }
            arglist[cnt] = (char*)calloc(1, (end-bg+1));
            strncpy(arglist[cnt],cmd_line+bg,(end-bg));
            cnt++;
            bg = end;
        }
        arglist[cnt] = NULL;
        
    }
  • 相关阅读:
    反射遍历实体类
    Socket通讯实例-基本Socket
    c#向数据库插入较大数据(SqlBulkCopy)
    C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
    jquery实现限制textarea输入字数
    jquery回车执行某个事件
    asp.net自定义404页面
    iis上json解析失败404
    echart 扩展地图不显示问题
    bootstarp 样式细节(tooltip布局)
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/3928615.html
Copyright © 2020-2023  润新知