项目目标:在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);
}
}
}