strtok et execlp dans une mini-coquille
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?
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");