Bonjour,

Je souhaiterai ajouter dans le minishell que j'ai créé un moyen de gérer les pipes avec des processus fils mais je ne vois pas trop comment faire donc je vais mettre ce que j'ai fait jusqu'à présent et si jamais vous avez des pistes... merci d'avance

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
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
88
89
90
/*
 * une boucle affiche le prompt, découpe les commandes avec la fonction decouper()
 * les commandes sont placées dans mot[MaxMot], exemple : la commande "ls" , est dans mot[0]
 * On découpe également le contenu de la variable PATH qui sera placé dans dirs[MaxDirs]
 * Après le fork, le processus père fait un wait, le processus fils execute la commande
 */
 
#include "sys.h"
 
enum{
	MaxLigne = 1024,		    //long max dune ligne de comm
	MaxMot = MaxLigne / 2,		   //nbre max de mot dans la ligne
	MaxDirs = 100,			   //nbre de repertoire dans PATH
	MaxPathLength = 512,		   //long max d'un nom de fichier
    };
 
 
void decouper(char *ligne, char *separ, char *mot[], int maxmot);
 
int main(int argc, char *argv[]){
    char ligne[MaxLigne];
    char pathname[MaxPathLength];
    char *mot[MaxMot];
    char *dirs[MaxDirs];
    int i = 0, tmp = 0, en_fond = 0;
 
 
    decouper(getenv("PATH"), ":", dirs, MaxDirs);               //decoupe le contenu de PATH avec le séparateur ":", le mettre dans dirs[MaxDirs]
								//lors de l'execution, la boucle cherchera l'executable dans les répertoires
 
    for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != 0; printf(PROMPT)){ 	//boucle affichage prompt et découpe de la ligne de commande
        decouper(ligne, " \n", mot, MaxMot);
 
	if (mot[0] == 0) // ligne vide
            continue;
 
 
 
        if ((strcmp(mot[0], "exit")) == 0) {
            break ;
            return 0;
	}
 
 
	tmp = fork();			//création de l'enfant
 
	if (tmp < 0){			
	    perror("fork");
	    continue;
	}
 
 
        if (tmp != 0) {             	//processus parent
            if (en_fond == 0) {     	// wait si la commande est en avant-plan
                while(wait(0) != tmp) ;
                    continue ;
            }
        }
 
 
 
/*************processus enfant*******************/
 
    for(i=0; dirs[i] != 0; i++){                                                  // boucle d'exécution cherchant l'exe dans les répertoires de dirs[MaxDirs]
        snprintf(pathname, sizeof pathname, "%s/%s", dirs[i], mot[0]);
	execv(pathname, mot);
 
    }
 
    fprintf(stderr, "%s: not found\n", mot[0]);                      //si l'exe n'est pas trouvé, on affiche un message d'erreur
    exit(1);
    }
 
 
    printf("Bye\n");
    return 0;
}
 
/************* decouper() avec strtok**************************/
void decouper(char *ligne, char *separ, char *mot[], int maxmot){
    int i;
    mot[0] = strtok(ligne, separ);
    for(i=1; mot[i-1] != 0; i++){
        if (i == maxmot){
	    fprintf(stderr, "erreur dans la fonction decouper : trop de mots\n");
	    mot[i-1] = 0;
	}
	mot[i] = strtok(NULL, separ);
    }
}

/*contient les directives d inclusion, sys.h */
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<string.h>
#include<unistd.h>
#define PROMPT "? "
#include <errno.h>