[Linux]シェル実装のシミュレーション:コマンドラインインタープリター

ステップバイステップの思考分析:

1.ユーザーのキーボード入力
キャプチャするscanf、getsなどの関数を使用して、ユーザー入力情報を取得します

2.入力情報を解析します-コマンド名と操作パラメーターを取得します。
取得した上位の入力情報を解析し、すべてのスペース、キャリッジリターン、タブなどを無視し、入力文字列のみを考慮します。
[ls-a-を入力し場合l]、取得する必要があるのは、3つの重要な情報 "ls" "-a" "-l"です。

3.子プロセスを作成し、プログラムを子プロセスのコマンド名に置き換えます(子プロセスにコマンドを実行させ
ます)。fork()を使用して子プロセスを作成し、プログラム置換関数(execvpなど)を使用します。 )子プロセスでプログラムを置換します。取得したls、-a、-lなどの情報をプログラム置換関数に渡し、子プロセスに関連する関数を実行させます。

4.プロセスは、子プロセスが終了するのを待機して待機し、ゾンビプロセスを防止します。
待機(NULL)を使用して、子プロセスが終了するのを待機し、ゾンビプロセスの表示とリソースリークを防止します。

完全なコード:

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

 int main()
 {
    
    
	   while (1)
		   {
    
    
		     printf("dev用户输入:");
		     fflush(stdout);
		     char cmd[1024] = {
    
     0 };
	         fgets(cmd, 1023, stdin);//获取键盘输入的信息
		     cmd[strlen(cmd) - 1] = '\0';
		     printf("cmd:[%s]\n", cmd);
		
			 char* ptr = cmd;
		     char* arg[32] = {
    
     NULL };
		     int my_argc = 0;
		     //解析获取到的信息--得到命令名称和运行参数
		     while (*ptr != '\0')
		     {
    
    
		       if (!isspace(*ptr))
				       {
    
    
				         arg[my_argc] = ptr;
				         my_argc++;

							while (*ptr != '\0' && !isspace(*ptr))
					         {
    
    
					           ptr++;
					         }

					   }
				* ptr = '\0';
	         
			 }
	          ptr++;
	        }
		arg[my_argc] = NULL;  
		pid_t pid = fork();
	  
			//创建子进程--进行程序替换
		    if (pid < 0)
		    {
    
    
		       perror("fork error:");
		       continue;
		    }
		   else if (pid == 0) 
			   {
    
    
			   //程序替换
		         execvp(arg[0], arg);
		         exit(-1);
			   }
	      wait(NULL);

	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43962381/article/details/115141007