用进程fork和exec来实现一个模拟shell(简单版,代码量少)

shell的概念 

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

fork

在Linux中,我们通常使用fork函数来为一个已经存在的进程创建一个新进程。而这个新创建出来的进程被称为原进程的子进程,原进程被称为该进程的父进程。

exec

exec 函数族提供了六种在进程中启动另一个程序的方法。exec 函数族的作用是根据指定的文件名或目录名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

#define FOUR_K 4096
#define ONE_K 1024

char USERNAME[32] = {"YCX"};//终端用户名
char commandbuf[FOUR_K] = {0};//4k缓冲区
char *Cmdbuff[10] = {0};

void ShowTerminal(void)
{
     char tmpbuf[ONE_K] = {0};
     char *show = NULL;
     show = getcwd(tmpbuf,sizeof(tmpbuf));
     printf("\33[1m\33[32m[Linux@%s]:\33[34m%s\33[0m$ ",USERNAME,show);
}
int GetCmd(char *cmd)
{
     fgets(cmd, FOUR_K, stdin);
     cmd[strlen(cmd) - 1] = '\0';
}
int AnalysisCmd(char *cmd)
{
     int cnt = 0;
     Cmdbuff[cnt] = strtok(cmd, " ");
     if (NULL == Cmdbuff[cnt])
          return 0;
     cnt++;
     while (NULL != (Cmdbuff[cnt] = strtok(NULL, " ")))
     {
          cnt++;
     }
     return cnt;
}
int MySystem(char **cmd)
{
     pid_t pid;
     pid = fork();
     if (-1 == pid)
     {
          perror("fail to pid\n");
          return -1;
     }
     if (0 == pid)
     {
          execvp(cmd[0], cmd);
          exit(0);
     }
     else if (pid > 0)
     {
          wait(NULL);
     }
}
int main(int argc, char const *argv[])
{
     int counter = 0;

     while (1)
     {
          ShowTerminal();                    //终端显示
          GetCmd(commandbuf);                //接收命令
          counter = AnalysisCmd(commandbuf); //解析命令
          if(0 == strcmp("cd",Cmdbuff[0]))    
          {
               chdir(Cmdbuff[1]);
               continue;
          }
          else if (0 == strcmp("exit",Cmdbuff[0]))
          {
               return 0;
          }
          
          MySystem(Cmdbuff);
     }

     return 0;
}

 运行如下,蓝色开头,紫色路径的为模拟shell

猜你喜欢

转载自blog.csdn.net/m0_58193842/article/details/128539764