-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3_4-moyen_shell.c
86 lines (72 loc) · 2.49 KB
/
3_4-moyen_shell.c
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
/*
* Auteur(s):
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define TRUE 1
#define LINE_SIZE 256
#define NB_ARG_MAX 256
int main() {
int pid, longueur, i, n;
char tab[LINE_SIZE], *s;
char *arg_tab[NB_ARG_MAX];
while (TRUE) {
fputs("petit_shell1...> ", stdout); /* Affichage d'un prompt */
s = fgets(tab, LINE_SIZE, stdin); /* lecture du clavier */
if (s == NULL) {
fprintf(stderr, "Fin du Shell\n");
exit(EXIT_SUCCESS);
}
longueur = strlen(s);
tab[longueur - 1] = '\0';
/* Analyse de la ligne de commande
* Dans un vrai Shell c'est beaucoup plus ellabore
* avec l'analyse de la syntaxe, des metacaracteres, etc... */
/* On repere l'adresse du debut de chaque mot de la ligne
* Cette adresse est stockee dans le tableau arg_tab
* Le mot est termine par le caractere ASCII NUL (8eb a 0)
* (Faites man ascii pour visualiser le tableau des
* caracteres ascii)
* Le tableau arg_tab est termine par le pointeur NULL */
longueur = strlen(tab);
i = 0;
n = 0;
while (i < longueur) {
/* On passe les blancs et tabulation */
while (tab[i] == ' ' || tab[i] == '\t') {
i++;
}
if (tab[i] == '\0')
break; /* fin de ligne, on sort */
/* stockage dans arg_tab de l'adresse trouvee */
arg_tab[n++] = &tab[i];
/* on va juste apres la fin du mot */
while (tab[i] != ' ' && tab[i] != '\t' && tab[i] != '\0')
i++;
/* On place un caractere ASCII NUL apres le dernier
* caractere du mot */
tab[i++] = '\0';
}
/* Si n vaut 0, la ligne ne contenait que des blancs
* ou tabulations, on retourne en debut de boucle principale */
if (n == 0)
continue;
/* On termine le tableau par le pointeur NULL */
arg_tab[n] = NULL;
/********* Fin de l'analyse de la ligne de commande *******/
pid = fork();
switch (pid) {
case 0: //Child
fprintf(stderr, "Erreur dans le exec %s %d\n",arg_tab[0], execvp(arg_tab[0],arg_tab));
exit(EXIT_SUCCESS);
break;
default: //Parent
wait(NULL);
break;
}
}
}