C语言 MINISHELL 简单实现

共分为四个部分

        1、主函数

        2、终端函数

        3、指令函数

        4、头文件,函数声明

1、主函数(man.c)

#include "head.h"
#include "terminal.h"
#include "commond.h"

int main(void)
{
    char commandbuf[1024] = {0};
    char *parg[10] = {NULL};
    int curcnt = 0;

    while (1)
    {
        /*显示终端*/
        ShowCommand();

        /*获得命令*/
        GetCommand(commandbuf, sizeof(commandbuf));

        /*记录命令*/
        RecordCommand(commandbuf);

        /*分割命令*/
        curcnt = SpiltCommand(commandbuf, parg, 10);

        /*执行命令*/
        DoCommand(parg, curcnt);

    }
}

2、终端显示函数(terminal.c)

#include "head.h"
#include "commond.h"

/*显示终端*/
int ShowCommand(void)
{
    char curpath[4096] = {0};
    char *pret = NULL;
    char *ptmp = NULL;

    pret = getcwd(curpath, sizeof(curpath));
    if (NULL == pret)
    {
        return -1;
    }

    ptmp = curpath + strlen(curpath);
    while (*ptmp != '/')
    {
        ptmp--;
    }
    if (0 != strcmp(curpath, "/"))
    {
        ptmp++;
    }
    
    printf("linux@ubuntu:%s#", ptmp);
    //fflush(stdout);
    
    return 0;
}


/*获得命令*/
int GetCommand(char *pcommand, int maxlen)
{
    fgets(pcommand, maxlen, stdin);
    pcommand[strlen(pcommand)-1] = '\0';

    return 0;
}

/*分割命令*/
int SpiltCommand(char *pcmd, char **pparg, int argmaxlen)
{
    int cnt = 0;

    pparg[cnt] = strtok(pcmd, " ");
    if (NULL == pparg[cnt])
    {
        return cnt;
    }
    cnt++;

    while (cnt < argmaxlen)
    {
        pparg[cnt] = strtok(NULL, " ");
        if (NULL == pparg[cnt])
        {
            return cnt;
        }
        cnt++;
    }
    
    return cnt;
}


/*执行命令*/
int DoCommand(char **pparg, int curcnt)
{
    if (0 == curcnt)
    {
        return 0;
    }

    if (0 == strcmp(pparg[0], "cd"))
    {
        MyCd(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "ls"))
    {
        MyLs(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "touch"))
    {
        MyTouch(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "history"))
    {
        MyHistory(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "chmod"))
    {
        MyChmod(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "find"))
    {
        MyFind(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "cp"))
    {
        MyCopy(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "mkdir"))
    {
        MyMakedir(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "rmdir"))
    {
        MyRmdir(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "cat"))
    {
        MyCat(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "mv"))
    {
        MyMove(pparg, curcnt);
    }
    else if (0 == strcmp(pparg[0], "exit"))
    {
        exit(0);
    }

    return 0;
}

/*记录命令*/
int RecordCommand(char *pcmd)
{
    FILE *fp = NULL;
    time_t t;
    struct tm *ptm = NULL;
    
    fp = fopen("/home/linux/history.txt", "a");
    if (fp == NULL)
    {
        return -1;
    }

    time(&t);
    ptm = localtime(&t);
    fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, pcmd);

    fclose(fp);

    return 0;
}

3、指令函数(command.c)

#include "head.h"

static int DisplayFiles(const char *pfilename);
static int ListDir(char *pdirname, char *pfilename);
static int PrintfFiles(char *pfilename);
static int CopyEveryThing(const char *dstfile, const char *srcfile);

/*查看文件详细信息*/
int DisplayFiles(const char *pfilename)
{
    struct stat buf;
    struct passwd *pwd = NULL;
    struct group *grp = NULL;
    struct tm *ptm = NULL;
    int ret = 0;
    char *pmon[12] = {"Jan", "Feb", "Mar", "Apri", "May", "Jun", "Jul", "Aug", "Stb", "Oct", "Nov", "Dec"};

    ret = lstat(pfilename, &buf);
    if (-1 == ret)
    {
        return -1;
    }

    if (S_ISREG(buf.st_mode))
    {
        printf("-");
    }
    else if (S_ISDIR(buf.st_mode))
    {
        printf("d");
    }
    else if (S_ISFIFO(buf.st_mode))
    {
        printf("p");
    }
    else if (S_ISLNK(buf.st_mode))
    {
        printf("l");
    }
    else if (S_ISSOCK(buf.st_mode))
    {
        printf("s");
    }
    else if (S_ISBLK(buf.st_mode))
    {
        printf("b");
    }
    else if (S_ISCHR(buf.st_mode))
    {
        printf("c");
    }

    buf.st_mode & S_IRUSR ? putchar('r') : putchar('-');
    buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');
    buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');
    buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');
    buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');
    buf.st_mode & S_IXGRP ? putchar('w') : putchar('-');
    buf.st_mode & S_IROTH ? putchar('w') : putchar('-');
    buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');
    buf.st_mode & S_IXOTH ? putchar('w') : putchar('-');
    
    printf(" %-2ld", buf.st_nlink);

    pwd = getpwuid(buf.st_uid);
    printf(" %-s", pwd->pw_name);

    grp = getgrgid(buf.st_gid);
    printf(" %-s", grp->gr_name);

    printf(" %-6ld", buf.st_size);

    ptm = localtime(&buf.st_mtime);
    printf(" %-s %-2d %-2d:%-2d", pmon[ptm->tm_mon], ptm->tm_mday, ptm->tm_hour, ptm->tm_min);

    printf(" %-s\n", pfilename);

    return 0;
}


/*查看当前目录所有文件 ls*/
int MyLs(char **pparg, int arglen)
{
    DIR *dp = NULL;
    struct dirent *pp = NULL;

    dp = opendir(".");
    if (dp == NULL)
    {
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (NULL == pp)
        {
            break;
        }

        if ('.' == *pp->d_name && (2 == arglen && 0 == strcmp(pparg[1], "-a")))
        {
            continue;
        }

        if (2 == arglen && 0 == strcmp(pparg[1], "-l"))
        {
            DisplayFiles(pp->d_name);
        }
        else
        {
            printf("%s ", pp->d_name);
        }
    }

    if (!(2 == arglen && 0 == strcmp(pparg[1], "-l")))
    {
        printf("\n");
    }
    
    closedir(dp);

    return 0;
    
}

/*切换文件cd*/
int MyCd(char **pparg, int arglen)
{
    if (arglen == 2)
    {
        chdir(pparg[1]);
    }
    
    return 0;
}

/*创建普通文件*/
int MyTouch(char **pparg, int arglen)
{
    if (arglen == 2)
    {
        fclose(fopen(pparg[1], "w"));
    }
    
    return 0;
}

/*显示历史命令*/
int MyHistory(char **parg, int arglen)
{
    FILE *fp = NULL;
    char *pret = NULL;
    char tempbuff[4096] = {0};

    fp = fopen("/home/linux/history.txt", "r");
    if (fp == NULL)
    {
        return -1;
    }

    while (1)
    {
        pret = fgets(tempbuff, sizeof(tempbuff), fp);
        if (pret == NULL)
        {
            break;
        }
        printf("%s", tempbuff);
    }
    
    fclose(fp);
}

/*修改文件权限*/
int MyChmod(char **pparg, int arglen)
{
    char *ptemp = NULL;
    int val = 0;
    int ret = 0;

    if (3 != arglen)
    {
        return -1;
    }

    ptemp = pparg[1];
    while (*ptemp != '\0')
    {
        val = val * 8 + (*ptemp - '0');
        ptemp++;
    }

    ret = chmod(pparg[2], val);
    if (-1 == ret)
    {
        return -1;
    }

    return 0;
}


/*遍历文件*/
int ListDir(char *pdirname, char *pfilename)
{
    DIR *dp = NULL;
    struct dirent *pp = NULL;
    char filepath[1024] = {0};

    dp = opendir(pdirname);
    if (dp == NULL)
    {
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (pp == NULL)
        {
            break;
        }
        if (*pp->d_name == '.')
        {
            continue;
        }

        sprintf(filepath, "%s/%s", pdirname, pp->d_name);
        if (0 == strcmp(pp->d_name, pfilename))
        {
            printf("%s\n", filepath);
        }
        
        if (DT_DIR == pp->d_type)
        {
            ListDir(filepath, pfilename);
        }
    }

    closedir(dp);

    return 0;
}

/*查找文件*/
int MyFind(char **pparg, int arglen)
{
    int ret = 0;

    if (4 != arglen)
    {
        return -1;
    }

    ret = ListDir(pparg[1], pparg[3]);
    if (-1 == ret)
    {
        return -1;
    }

    return 0;
}

/*复制过程*/
int CopyEveryThing(const char *dstfile, const char *srcfile)
{
    FILE *dst = NULL;
    FILE *src = NULL;
    size_t ret = 0;
    char tempbuff[4096] = {0};

    dst = fopen(dstfile, "w");
    if (dst == NULL)
    {
        goto err2;
    }
    src = fopen(srcfile, "r");
    if (src == NULL)
    {
        goto err1;
    }

    while (1)
    {
        ret = fread(tempbuff, 1, sizeof(tempbuff), src);
        if (0 == ret)
        {
            break;
        }

        fwrite(tempbuff, 1, sizeof(tempbuff), dst);
    }

    fclose(dst);
    fclose(src);

    return 0;

err1:
    fclose(dst);
err2:
    return -1;
    
}

/*复制文件*/
int MyCopy(char **pparg, int arglen)
{
    int ret = 0;

    if (3 != arglen)
    {
        return -1;
    }

    ret = CopyEveryThing(pparg[2], pparg[1]);
    if (-1 == ret)
    {
        return -1;
    }

    return 0;
}

/*创建文件夹*/
int MyMakedir(char **pparg, int arglen)
{
    if (arglen == 2)
    {
        mkdir(pparg[1], 0664);
    }

    return 0;
}

/*删除文件夹*/
int MyRmdir(char **pparg, int arglen)
{
    if (arglen == 2)
    {
        rmdir(pparg[1]);
    }

    return 0;
}

/*剪切、移动、重命名文件*/
int MyMove(char **pparg, int arglen)
{
    int ret = 0;

    if (3 != arglen)
    {
        return -1;
    }

    ret = MyCopy(pparg, arglen);
    if (-1 == ret)
    {
        return -1;
    }

    ret = MyRmdir(pparg, arglen);
    if (-1 == ret)
    {
        return -1;
    }

    return 0;
}

/*打印文件内容*/
int PrintfFiles(char *pfilename)
{
    FILE *fp = NULL;
    char *pret = NULL;
    char temp[4096] = {0};

    fp = fopen(pfilename, "r");
    if (fp == NULL)
    {
        perror("Open Failed");
        return -1;
    }

    while (1)
    {
        pret = fgets(temp, sizeof(temp), fp);
        if (pret == NULL)
        {
            break;
        }
        printf("%s", temp);
    }

    fclose(fp);

    return 0;
}


/*查看文件内容*/
int MyCat(char **pparg, int arglen)
{
    if (2 == arglen)
    {
        PrintfFiles(pparg[1]);
    }

    return 0;
}

4、声明

        1、head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <grp.h>
#include <pwd.h>



#endif

        2、terminal.h

#ifndef __TERMINAL_H__
#define __TERMINAL_H__

extern int ShowCommand(void);
extern int GetCommand(char *pcommand, int maxlen);
extern int SpiltCommand(char *pcmd, char **pparg, int argmaxlen);
extern int DoCommand(char **pparg, int curcnt);
extern int RecordCommand(char *pcmd);

#endif

        3、command.h

#ifndef __COMMAND_H__
#define __COMMAND_H__

extern int MyLs(char **pparg, int arglen);
extern int MyCd(char **pparg, int arglen);
extern int MyTouch(char **pparg, int arglen);
extern int MyHistory(char **parg, int arglen);
extern int MyChmod(char **pparg, int arglen);
extern int MyFind(char **pparg, int arglen);
extern int MyCopy(char **pparg, int arglen);
extern int MyMakedir(char **pparg, int arglen);
extern int MyRmdir(char **pparg, int arglen);
extern int MyMove(char **pparg, int arglen);
extern int MyCat(char **pparg, int arglen);

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值