Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/06/2011, 13h13   #1
Nouveau Membre du Club
 
Homme Allan Lunel
Ingénieur développement logiciels
Inscription : mai 2006
Messages : 53
Détails du profil
Informations personnelles :
Nom : Homme Allan Lunel
Âge : 24
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 53
Points : 38
Points : 38
Par défaut Création d'un minishell avec interprétation des pipes

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 :
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>
H1B4K est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h15.


 
 
 
 
Partenaires

Hébergement Web