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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
				execvp(com[i],com);
D'ou sort com? De analex, mais que contient t-il? pas grand chose à en croire analexc. dont commande hérite.

Voici commande.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++;
			}
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
 
#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!