Bonjour!
J'essaye de comprendre un code de shell unix fait à la main mais j'ai du mal à comprnedre d'ou est-ce qu'il sort ses arguments pour appliquer les commandes qu'on lui passe.
Dans la fonction commande on a un fork qui laisse un fils executer une commande tandis qu'un père attend sa fin pour soit-disant executer la commande suivante.
Cependant dans le fils on a
D'ou sort com? De analex, mais que contient t-il? pas grand chose à en croire analexc. dont commande hérite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 execvp(com[i],com);
Voici commande.c
la seule affectation que je vois de com est dans analex.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include "analex.c" #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <signal.h> // passer les variables de commande en variables globales int commande(){ int symbole; int status; pid_t pid; int tube[2]; /* Tube a utiliser */ int z; // pipe int screen; int fo; int keyboard; while(1){ symbole = getSymbole(); switch(symbole){ case 0: // NL case 1: // ; com[i++] = 0;// d'ou vient com[]? pid=fork(); /* Mettre un if pour que le pere observe le fils le exec sera dans le fils */ if(pid>0){ int val_wait = wait(&status);// Cette instruction suspend le processus père jusqu'à ce qu'un des processus fils se termine, elle retourne le pid du processus qui s'est terminé et l'état du processus terminé est placé à l'adresse &status. if(WIFEXITED(status)){// et pas de valwait? /* i = 0 permet d'executer la commande suivante */ i = 0; /* A la fin de l execution normale du fils, on retourne vers le processsus pere le return 0 permet d'afficher le prompt Dauphine> conformement au switch du main.c */ return 0; } } else{ i=0; execvp(com[i],com); i++; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdio.h> #include <string.h> #include <ctype.h> typedef enum {START, IN_WORD} STATE; char *specials = "|&;><"; /* les caracteres speciaux qui peuvent terminer un mot */ int i = 0; char w[16]; char* com[64]; int e; // Esperance int getSymbole() { STATE state = START; int i = 0; char c; while (1) { //fprintf(stderr,"debut_analex1\n"); c = getchar(); //fprintf(stderr,"debut_analex2\n"); switch (state) { case START: if (c == '|'){ w[i++] = ';'; return 5; }/************** plein de cas ****************/ } else if ( !isspace(c) ) { /* on lit un mot */ i = 0; w[i++] = c; state = IN_WORD; } break; case IN_WORD: if ( isspace(c) || strchr(specials, c) ) { /* fin d'un mot */ w[i] = 0; ungetc(c, stdin); //fprintf(stderr,"debut_analex_fin word\n"); state = START; return 10; } else { w[i++] = c; //fprintf(stderr,"debut_analex_mot\n"); } break; default: break; } } }
A moins que ce ne soit fait par getchar mais je ne crois pas que ce soit son rôle?
Merci beaucoup pour votre aide!
Partager