プロセスフォークと実行を使用してシミュレートされたシェルを実装します (シンプルバージョン、コードが少ない)

シェルの概念 

シェルはシステムのユーザー インターフェイスであり、ユーザーがカーネルと対話するためのインターフェイスを提供します。ユーザーが入力したコマンドを受け取り、実行のためにカーネルに送信します。

実際、シェルはコマンドインタープリタであり、ユーザーが入力したコマンドを解釈してカーネルに送信します。それだけでなく、シェルにはコマンド編集用の独自のプログラミング言語があり、ユーザーはシェル コマンドで構成されるプログラムを作成できます。シェルプログラミング言語は、ループ構造や分岐制御構造など、通常のプログラミング言語の多くの特徴を備えています。このプログラミング言語で記述されたシェルプログラムは、他のアプリケーションプログラムと同様の効果をもたらします。

フォーク

Linux では、通常、fork 関数を使用して、既存のプロセスに新しいプロセスを作成します。そして、この新しく作成されたプロセスを元のプロセスの子プロセスと呼び、元のプロセスをそのプロセスの親プロセスと呼びます。

実行する

exec ファミリの関数には、プロセス内で別のプログラムを開始する 6 つの方法が用意されています。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;
}

 次のように実行します。青から始まり、紫色のパスがシミュレートされたシェルです。

 

おすすめ

転載: blog.csdn.net/m0_58193842/article/details/128539764
おすすめ