Lancer des processus en arrière plan
Bonsoir,
Je veux modifier le shell simple si desous pour permettre de lancer
des processus en arrière plan, comme dans les shells ordinaires,
en terminant la commande avec un "&". Exemples :
? sleep 1000 &
? sleep 1000&
Code:
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;
} |
Merci.