strtok y execlp en un mini-shell
Pregunta
Estoy escribiendo un mini-shell para familiarizarme con la gestión de procesos de Unix en C. Está leyendo cosas desde la línea de comandos y pasa estos argumentos a través de execlp al sistema.
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
#define MAXSIZE 100
char prompt[MAXSIZE];
int main(void)
{
pid_t pid;
printf("> ");
// read stuff
if (fgets(prompt, MAXSIZE, stdin) == NULL){
printf("Input validation error!");
abort();
}
// printf("DEBUG: %s" , prompt);
if (strcmp(prompt, "exit")==0) abort();
if ((pid=fork())<0){ // copy process
printf("Process error!");
abort();
}
if (pid==0){ // exec in son-prcess
char *command=(char*)strtok(prompt, " ");
execlp(command, command, 0); // overwrite memory
printf("Error, command not found!");
abort();
} else {
waitpid(pid, 0, 0);
}
}
De hecho, este sería, pero no obtengo ningún resultado de execlp ()
.
¿Alguien sabe por qué es eso?
Solución
Intenté ejecutar su programa y falló porque el comando
contenía un \ n
(nueva línea). Lo modifiqué poniendo \ n
en lugar de " " en el strtok
y luego se ejecutó con éxito.
En detalle:
if (pid==0){ // exec in son-prcess
char *command=(char*)strtok(prompt, "\n");
printf ("'%s'\n", command);
execlp (command, command, 0); // overwrite memory
printf("Error %d (%s)\n", errno, strerror (errno));
abort();
} else {
Ejecución de prueba:
$ ./a.out > ls 'ls' (usual ls behaviour)
Otros consejos
Kinopiko ya descubrió por qué no funciona, pero la razón por la que no vio ningún mensaje de error es que su indicador de shell lo sobrescribe. Intenta poner una nueva línea al final:
printf("Error, command not found!\n");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow