项目:仿写bash程序

 

项目目标:在linux平台下仿写一些命令的实现

1.输出提示符信息,类似于[stu@host Desktop]$

2.等待用户输入命令

3.完成简单的解析:没输入命令情况(直接敲回车),输入内置命令的情况(cd exit...),输入外置命令的情况(ls...)

代码的总体框架就是这样的

要想实现上述功能我们要清楚linux系统中命令的存放位置已经分类标准

我们在终端上查看一下:

如果是内置命令:需要把命令集成到bash程序中。实现内置命令只要调用bash中的方法

如果是外置命令:linux的外置命令存储在/bin目录下,都是单独实现,就像上方的ps一样他是独自产生了一个新的进程,而不是作为在bash进程中统一实现。但它不是和bash没有一点关系,大家注意一下上方的pid和ppid,ps-ef的父进程的pid就是bash的pid,所以ps-ef这个进程是bash创建的。所以实现逻辑就是这样:

while(1)

1.创建进程:

2.子进程通过执行exec替换成用户输入的命令对应程序。//因为我们输入的是ps -f,然后就找到对应命令进行替换

3.父进程等待命令执行结束——前台执行(wait防止僵死进程)

4.父进程继续输出提示信息,接受用户输入新命令————后台执行(wait防止僵死进程)

这里给大家一个简单的框架,具体的实现大家可以自己动手完成,也可以下载我的项目压缩包

#include<stdio.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define CMDLEN 128//输入命令到最大长度
#define NUM 20//参数到个数

//打印提示信息
//提示信息组成:[用户名@主机名 当前工作目录]标识符
void PrintInfo()
{
}

//切割命令,参数.分别存储到指针数组中
void CutCommand(char*cmd,char *cmdArr[])
{

}

//实现cd命令
void MyCdcommand()
{
}

void Dealexec()
{
}
//实现外置命令
void DealExec(char* cmdArr[])
{
    pid_t pid=fork();
    assert(pid!=-1);

    if(pid==0)
    {
        //execv();
    }
    else//父进程,分前后台
    {
        //前台
        wait(NULL);
    }

}
int main()
{
    while(1)
    {
        //1.打印提示信息
        PrintInfo();

        //2.获取输入到命令
        char cmd[CMDLEN]={0};
        fgets(cmd,127,stdin);//把输入到信息放到cmd中,包含最后到回车符
        if(strlen(cmd)==0)//输入为空
        {
            continue;
        }
        cmd[strlen(cmd)-1]=0;//把回车符置0;
        
        //命令与参数分割 比如 ls -a -l -i
        //                     0  1  2  3
        char *cmdArr[NUM]={0};
        CutCommand(cmd,cmdArr);//切割后把参数放入对应到下标
        
        //3.对面临进行区分: 输入内置命令 输入外置命令
        if(strlen(cmdArr[0])==2 && strncmp(cmdArr[0],"cd",2)==0)//说明输入的命令是cd,也就是内置命令
        {
            //执行cd命令,因为cd是切换工作目录的,所以就需要cmdArr[1]中存储到内容
            MyCdcommand(cmdArr[1]);
            continue;
        }
        else if(strlen(cmdArr[0])==4 && strncmp(cmdArr[0],"exit",4)==0)//输入的是内置命令exit
        {
            exit(0);
        }
        else//就是外置命令
        {
            Dealexec(cmdArr);
        }
    }
}

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值