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?

¿Fue útil?

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
scroll top