1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <stdlib.h>
# include <sys/types.h>
# include <sys/wait.h>
enum {
MaxLigne = 1024, // longueur max d'une ligne de commandes
MaxMot = MaxLigne / 2, // nbre max de mot dans la ligne
};
# define PROMPT "? "
/* decouper -- decouper une chaine en mots */
static void decouper(char ligne[], char separ[], char * mot[], int maxmot) {
int i, j;
if (mot[0] == 0)
return;
for(mot[0] = strtok(ligne, separ), i = 1; mot[i - 1] != 0 && i < maxmot - 1; i++)
mot[i] = strtok(NULL, separ);
mot[i] = 0;
# ifdef DEBUG
printf("liste des mots :\n");
for(j = 0; j < i; j++)
printf("\t'%s'\n", mot[j]);
printf("fin de la liste des mots\n");
# endif
}
int main(int argc, char * argv[]) {
char ligne[MaxLigne];
char *mot[MaxMot];
int tmp;
/* Lire et traiter chaque ligne de commande */
for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != 0; printf(PROMPT)){
decouper(ligne, " \t\n", mot, MaxMot);
if (mot[0] == 0) // ligne vide
continue;
// Commande spéciale qui doit être exécutée par le parent
if (strcmp(mot[0], "cd") == 0){
if (mot[1] == 0)
mot[1] = getenv("HOME");
else if (mot[2] != 0){
fprintf(stderr, "usage: cd [dir]\n");
continue;
}
if (chdir(mot[1]) < 0)
perror("cd");
continue;
}
tmp = fork(); // lancer le processus enfait
if (tmp < 0){
perror("fork");
continue;
}
if (tmp != 0){ // parent : attendre la fin de l'enfant
while(wait(0) != tmp)
;
continue;
}
execvp(mot[0], mot); // enfant : exécuter la commande
// si on arrive ici, c'est qu'il y a une erreur
perror(mot[0]);
exit(1);
}
printf("Bye\n");
return 0;
}
error(mot[0]);
exit(1);
}
printf("Bye\n");
return 0;
} |
Partager