Question

J'écris un mini-shell pour mieux se familiariser avec la gestion de processus Unix en C. Il lit des éléments en ligne de commande et transmet ces arguments via execlp au système.

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

En fait, ce serait bien cela, mais je n’obtiens aucune sortie de execlp () . Est-ce que quelqu'un sait pourquoi?

Était-ce utile?

La solution

J'ai essayé d'exécuter votre programme et cela a échoué car la commande contenait un \ n (nouvelle ligne). Je l'ai modifié en mettant \ n à la place de " " dans le strtok et il a ensuite été exécuté avec succès.

En détail:

  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 {

Test:

$ ./a.out 
> ls
'ls'
(usual ls behaviour)

Autres conseils

Kinopiko a déjà compris pourquoi cela ne fonctionne pas, mais la raison pour laquelle vous n’avez pas vu de message d’erreur est que votre invite de commande l’écrase. Essayez de mettre une nouvelle ligne à la fin:

printf("Error, command not found!\n");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top