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 88 89 90
| /*
* une boucle affiche le prompt, découpe les commandes avec la fonction decouper()
* les commandes sont placées dans mot[MaxMot], exemple : la commande "ls" , est dans mot[0]
* On découpe également le contenu de la variable PATH qui sera placé dans dirs[MaxDirs]
* Après le fork, le processus père fait un wait, le processus fils execute la commande
*/
#include "sys.h"
enum{
MaxLigne = 1024, //long max dune ligne de comm
MaxMot = MaxLigne / 2, //nbre max de mot dans la ligne
MaxDirs = 100, //nbre de repertoire dans PATH
MaxPathLength = 512, //long max d'un nom de fichier
};
void decouper(char *ligne, char *separ, char *mot[], int maxmot);
int main(int argc, char *argv[]){
char ligne[MaxLigne];
char pathname[MaxPathLength];
char *mot[MaxMot];
char *dirs[MaxDirs];
int i = 0, tmp = 0, en_fond = 0;
decouper(getenv("PATH"), ":", dirs, MaxDirs); //decoupe le contenu de PATH avec le séparateur ":", le mettre dans dirs[MaxDirs]
//lors de l'execution, la boucle cherchera l'executable dans les répertoires
for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != 0; printf(PROMPT)){ //boucle affichage prompt et découpe de la ligne de commande
decouper(ligne, " \n", mot, MaxMot);
if (mot[0] == 0) // ligne vide
continue;
if ((strcmp(mot[0], "exit")) == 0) {
break ;
return 0;
}
tmp = fork(); //création de l'enfant
if (tmp < 0){
perror("fork");
continue;
}
if (tmp != 0) { //processus parent
if (en_fond == 0) { // wait si la commande est en avant-plan
while(wait(0) != tmp) ;
continue ;
}
}
/*************processus enfant*******************/
for(i=0; dirs[i] != 0; i++){ // boucle d'exécution cherchant l'exe dans les répertoires de dirs[MaxDirs]
snprintf(pathname, sizeof pathname, "%s/%s", dirs[i], mot[0]);
execv(pathname, mot);
}
fprintf(stderr, "%s: not found\n", mot[0]); //si l'exe n'est pas trouvé, on affiche un message d'erreur
exit(1);
}
printf("Bye\n");
return 0;
}
/************* decouper() avec strtok**************************/
void decouper(char *ligne, char *separ, char *mot[], int maxmot){
int i;
mot[0] = strtok(ligne, separ);
for(i=1; mot[i-1] != 0; i++){
if (i == maxmot){
fprintf(stderr, "erreur dans la fonction decouper : trop de mots\n");
mot[i-1] = 0;
}
mot[i] = strtok(NULL, separ);
}
} |
Partager