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