IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Creer plusieurs processus et plusieurs pipes .en C


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Points : 47
    Points
    47
    Par défaut Creer plusieurs processus et plusieurs pipes .en C
    bonsoir, je veux creer npipes et n processus , dans mon cas je vais prendre 4 pipes .. je lis sur l'entrée strandard et j'ecris dans le premier tube et ainsi de suite jusqu'au dernier qui ecrit sur la sortie standard.

    voici mon code . est 'il correct car quand je l'execute il me donne pas la main pour introduire une donnée avec le clavier(entrée standard).
    Code C : 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
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/wait.h> 
     
    int main() {
     
    int n,i=0, t[2];
    char buffer [512];
     
    for(i;i>4;i++)
     
    {
     
    	/*creer le tube*/
     
    	  if (pipe(t) == -1){  
    		perror("pipe"); 
    		exit(1);
      		 }
    	printf("Le tube %d\n",i);
     
     
           /*dupliquer un processus*/
     
    	switch(fork()){
    		case -1:
    			{
    			printf("erreur\n"); 
    			exit(1);
    			}
     
    		case 0 : /*fils*/
     
    			/*fermer la sortie du tube*/
    			 close (t[1]);
    			/* lecture du tube*/
                             while ((n=read(t[0],buffer,sizeof(buffer)))>0)
    			/*ecriture sur la sortie standard*/
    			 write(1,buffer,n);
    			/*fermer la sortie du tube*/
    			close(t[0]);
    			exit(0);
     
     
    		default: /*le père*/
     
    			/*fermer la sortie du tube*/
    			close (t[0]);
     
    			/*lecture de l'entrée standard*/
    			while((n=read(1,buffer,sizeof(buffer)))>0)
    			/*ecriture dans le tube*/
    			write(t[1],buffer,n);
    			/*fermer l'entrée du tube*/
    			close(t[1]);
     
     
     
    		}
     
    }
    exit(EXIT_SUCCESS);
     
    }

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression que t'as récupéré un code de communication à un pipe entre 2 processus et que t'as essayé de l'adapter à 4 processus en le mettant dans une boucle (et ça foire de suite ne serait-ce que parce que tu n'as qu'un seul pipe "t" et non 4 comme tu le dis)

    Commence d'abord par faire marcher ton code à un pipe. Il est d'ailleurs presque parfait (faut juste ne pas le mettre dans une boucle). Et analyse son fonctionnement
    - le père ferme le coté lecture de son pipe et écrit dans le coté écriture
    - le fils ferme le coté écriture et lit le coté lecture

    Ensuite, une fois que t'auras bien pigé le truc, adapte-le à 4 processus (te faudra 3 tubes et non un seul) avec chaque processus "p" qui écrit sur son tube "p" et qui va lire le tube "p - 1" ce qui donne
    - le père (processus 0) écrit sur le tube [0]
    - le fils 1 lit le tube[0] et écrit sur le [1]
    - le fils 2 lit le tube[1] et écrit sur le [2]
    - le fils 3 lit le tube[2] et écrit sur l'écran
    Bien sûr, chaque tube[n] possède lui-même un cote[0] et un cote[1]. Je serais d'ailleurs d'avis de créer le type "pipe" ce qui te permettrait de pas te mélanger les pinceaux entre "tableau de pipes" et "tableau des cotés"
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct {
        int cote[2];
    } t_pipe;
     
    int main()
    {
        t_pipe tabPipe[3];
        size_t i;
     
        for (i=0; i < 3; i++)
             pipe(tabPipe[i]);
    }

    Ensuite, faut créer les 3 fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (i=0; i < 4; i++)
    {
         if (fork() == 0)
         {
              // on est dans le fils => gestion du processus
              processus(i, tabPipe); 
              exit(0);
         }
    }
    Ensuite à toi de définir la fonction "processus()" qui sera dévolue à un processus quel qu'il soit. Faut bien entendu te rappeler que le processus(n) va lire le pipe "n - 1" et écrire sur le pipe "n" (donc ils n'ont pas besoin des pipes qui ne sont pas "n" ou "n -1"). Par exemple, la fonction peut démarrer comme ça
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void processus(int n, t_pipe tabPipe[3])
    {
        size_t i;
        for (i=0; i < 3; i++)
        {
             if ((i + 1) != n)
                  close(tabPipe[i][0]);
             if (i != n)
                  close(tabPipe[i][1]);
        }
     
         ... ensuite à toi de voir (je vais pas tout te faire quand-même...)
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Lancement de plusieurs processus
    Par Premium dans le forum Administration système
    Réponses: 5
    Dernier message: 30/05/2006, 12h11
  2. Réponses: 2
    Dernier message: 03/03/2006, 20h24
  3. Réponses: 12
    Dernier message: 13/01/2006, 10h14
  4. [DEBUTANT]Lancer plusieurs processus
    Par demontools dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/04/2005, 13h48
  5. [postgresql]creer une table avec plusieurs clés primaire??
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2004, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo