【Linux】C语言实现简易的Linux shell命令行解释器

我们要实现自己的简易的shel,先了解一下shell运行原理。

1. shell运行原理

shell从用户读入字符串"ls"。shell建立一个子进程,在子进程中运行ls程序并等待进程结束。

【Linux】C语言实现简易的Linux shell命令行解释器_第1张图片

然后shell读取新的一行输入,建立一个新的子进程,在这个进程中运行程序并等待进程结束。

所以要实现一个shell,要循环以下过程:

  1. 获取命令行
  2. 解析命令行
  3. 建立子进程
  4. 替换子进程

【Linux】C语言实现简易的Linux shell命令行解释器_第2张图片

2. 输出提示符

int main()
{
    //输出提示符
    printf("用户名@主机号 当前路径# ");
    fflush(stdout);//刷新缓冲区
}

此时就可以输入命令了。但是输入的命令,这些命令的字符串必须拿到可执行程序myshell中。

3. 获取用户输入

要获取一行内容,可以使用C库提供的fgets()函数。

【Linux】C语言实现简易的Linux shell命令行解释器_第3张图片

#define NUM 1024
char lineCommand[NUM];
//获取用户输入
char* s = fgets(lineCommand,sizeof(lineCommand)-1,stdin);//预留一个位置极端情况下把\0留出来。
assert(s!=NULL);

这个时候我们输入的命令就已经被myshell程序获取到了。接下来我们可以来测试一下拿到的行字符串。

3.1 测试行字符串

//测试拿到的行字符串
printf("test : %s",lineCommand);

可以看到,程序确实拿到了正确的字符串。但是这里其实存在着一个隐性的问题,如果我们把测试代码printf语句加上\n:

//测试拿到的行字符串
printf("test : %s\n",lineCommand);

【Linux】C语言实现简易的Linux shell命令行解释器_第4张图片

输出的结果多了一行空行。是由于给printf语句末尾加上"\n"导致的吗?

并不是。我们以前写的代码带"\n",它就是回车,紧挨着就是下一行,例如:

【Linux】C语言实现简易的Linux shell命令行解释器_第5张图片

原因其实是用户在输入指令后一定都会摁“回车键”,所以最后都会多输入一个"\n"。例如输入“ls -a -l”摁回车,其实是输入了“ls -a -l \n”。

那么此时,我们

你可能感兴趣的:(Linux,linux,运维,服务器,c语言)