[Linux] Simuler l'implémentation du shell: interpréteur de ligne de commande

Analyse de la pensée étape par étape:

1. Capturez l'entrée du clavier de l'
utilisateur Utilisez des fonctions telles que scanf, gets, etc. pour obtenir les informations d'entrée de l'utilisateur

2. Analysez les informations d'entrée - obtenez le nom de la commande et les paramètres de fonctionnement.
Analysez les informations d'entrée supérieures obtenues, ignorez tous les espaces, retours chariot, tabulations, etc., et ne vous souciez que de la chaîne d'entrée.
Si vous entrez [ls -a - l], ce que nous devons obtenir, ce sont les trois informations clés "ls" "-a" "-l"

3. Créez un processus enfant et remplacez le programme par le nom de commande du processus enfant (laissez le processus enfant exécuter la commande)
utilisez fork () pour créer le processus enfant, puis utilisez la fonction de remplacement de programme (execvp, etc. ) dans le processus enfant pour remplacer le programme. Passez les informations obtenues telles que ls, -a, -l à la fonction de remplacement de programme et laissez le processus enfant exécuter les fonctions associées.

4. Le processus attend et attend que le processus enfant se termine pour empêcher les processus zombies.
Utilisez wait (NULL) pour attendre la fin de tout processus enfant afin d'éviter l'apparition de processus zombies et la fuite de ressources.

Code complet:

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43962381/article/details/115141007
conseillé
Classement