[Linux] Simular implementación de shell: intérprete de línea de comandos

Análisis de pensamiento paso a paso:

1. Capturar la entrada del teclado del usuario
Utilice funciones como scanf, gets, etc. para obtener información de entrada del usuario

2. Analice la información de entrada: obtenga el nombre del comando y los parámetros de funcionamiento.
Analice la información de entrada superior obtenida, ignore todos los espacios, retornos de carro, tabulaciones, etc., y solo preocúpese por la cadena de entrada.
Si ingresa [ls -a - l], lo que necesitamos obtener son las tres informaciones clave "ls" "-a" "-l"

3. Cree un proceso hijo y reemplace el programa con el nombre del comando para el proceso hijo (deje que el proceso hijo ejecute el comando)
use fork () para crear el proceso hijo y luego use la función de reemplazo del programa (execvp, etc. ) en el proceso hijo para reemplazar el programa Pase la información obtenida, como ls, -a, -l a la función de reemplazo del programa, y ​​deje que el proceso hijo realice funciones relacionadas.

4. El proceso espera y espera a que el proceso hijo salga para evitar procesos zombies.
Utilice esperar (NULL) para esperar a que salga cualquier proceso hijo para evitar que aparezcan procesos zombies y fugas de recursos.

Código completo:

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

Supongo que te gusta

Origin blog.csdn.net/weixin_43962381/article/details/115141007
Recomendado
Clasificación