打印

linux用c语言实现minishell源程序与流程图

[复制链接]
212|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Spikess|  楼主 | 2018-9-30 08:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在Linux系统下实现Minishell程序流程图











编写一个minishell并支持如下命令:

        1.能够显示用户、shell名字及当前工作路径

            minishell@zhao:minishell#

        2.支持命令输入格式为

            command [-options] arg1 arg2 arg3 ...

        3.支持的command有如下命令:

            ls

            ls -a

            ls -l

            touch

            rm

            mkdir

            rmdir

            pwd

            cd

            cp

            mv

            ln

            ln -s

            chmod

            cat

            exit

            

            ls a.out

            ls -l a.out

            

        4.用户输入的命令按照日期时间命令的形式存放在日志文件中记录

        



1.minishell能够打印命令提示行[用户名@操作系统名:当前路径]

    用gwtcpwd获取当前位置绝对路径,获取最后一个路径名打印

2.从终端接收命令

    1.gets从stdin接收命令

    2.封装添加时间戳函数,将接收到的命令添加时间戳写入日志文件

    3.用strtok将命令剪切;根据第一部分判断需要执行的命令

                        再次剪切并根据第二部分再次判断

                        .....

                        

    4.封装相对应的函数执行相关命令

   

3.封装执行command命令函数

    1.ls

            ls

            ls -a

            ls -l

    2.touch

    3.rm

    4.mkdir

    5.rmdir

    6.pwd

    7.cd

    8.cp

    9.mv

    10.ln

        ln

        ln -s

    11.chmod

    12.cat

    13.exit



4.返回第一步   



C语言源程序如下:

#include "head.h"



char curpath[512];

char curcommand[1024];



/* 显示终端界面 */

void showcommand(void)

{

        char *ptmp = NULL;



        getcwd(curpath, sizeof(curpath));

        ptmp = curpath + strlen(curpath);

        while (*ptmp != '/')

        {

                ptmp--;

        }

        ptmp++;

        printf("minishell@zhao:%s#", ptmp);

        fflush(stdout);



        return;

}



/* 获得命令 */

void getcommand(void)

{

        fgets(curcommand, sizeof(curcommand), stdin);

        curcommand[strlen(curcommand)-1] = '\0';



        return;

}



void mycd(char *dirname)

{

        chdir(dirname);



        return;

}



void myls(void)

{

        DIR *dp = NULL;

        struct dirent *pp = NULL;

        

        dp = opendir(".");

        while ((pp = readdir(dp)) != NULL)

        {

                if ('.' == pp->d_name[0])

                {

                        continue;

                }

                printf(" %s ", pp->d_name);

        }

        printf("\n");



        closedir(dp);

}        



/* 执行命令 */

void docommand(void)

{

        char *p = NULL;



        p = strtok(curcommand, " ");

        if (!strcmp(p, "cd"))

        {

                p = strtok(NULL, " ");

                mycd(p);

        }

        else if (!strcmp(p, "ls"))

        {

                if (NULL != (p = strtok(NULL, " ")) && !strcmp(p, "-l"))

                {

                        mylsl();

                }

                else if (NULL != p && !strcmp(p, "-a"))

                {

                        mylsa();

                }

                else

                {

                        myls();

                }

        }

}



int main(int argc, const char *argv[])

{

        while (1)

        {

                showcommand();

                getcommand();

                docommand();

        }



        return 0;

}



复制代码

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

421

帖子

0

粉丝