strtok et execlp dans un mini-shell

J’écris un mini-shell pour me familiariser davantage avec la gestion des processus Unix en C. Il lit les fichiers en ligne de commande et les transmet via execlp au système.

# include  # include  # include  #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 le cas, mais je ne reçois aucune sortie de execlp() . Est-ce que quelqu’un sait pourquoi?

J’ai essayé d’exécuter votre programme et il a échoué car la command contenait un \n (newline). Je l’ai modifié en mettant \n au lieu de “” dans le strtok et il a ensuite fonctionné 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 { 

Essai:

 $ ./a.out 
 > ls
 'ls'
 (comportement habituel de ls)

Kinopiko a déjà trouvé pourquoi cela ne fonctionnait pas, mais la raison pour laquelle vous ne voyez aucun message d’erreur est que l’invite de votre shell la remplace. Essayez de mettre une nouvelle ligne à la fin:

 printf("Error, command not found!\n");