Comment s'initialise le tableau de commande com[i] passé à exevp?
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.
Voici commande.c
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
|
#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:
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!