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

C Discussion :

PIPES bidirectionnel / fork() en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut PIPES bidirectionnel / fork() en C
    Bonjour à tous,

    Je dois faire un script en C qui utilisent 2 pipes ainsi qu'un fork().
    Le rôle du programme est de lire une saisie au clavier par le pipe 1
    exemple : 4 5
    Le pipe1 envoi au pipe 2 le 4 5 qui lui calcul la somme 4 5 et qui renvois donc 9 au pipe 1.

    Le programme ci dessous ne fonctionne pas.

    Le lire.sh contient en shell
    read param et un echo $param

    Merci de votre aide


    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
     
    #include <stdio.h>
    #include <unistd.h>
    #include <wait.h>
    int main() {
      int n, p[2], p2[2];
      char c, c2;
     
      //creation des tube anonyme  
      if ( pipe(p) != 0 ) { 
        perror ("probleme appel pipe");
        exit (1);
      }
      if ( pipe(p2) != 0 ) { 
        perror ("probleme appel pipe");
        exit (2);
      }
      //on clone le process pour avoir 2 processus partageant le m?me pipe 
      if ( ( n = fork() ) == -1 ) { 
        perror ("probleme appel fork");  
        exit (3);
      } else if ( n == 0 ){ //le fils
       char texte2[30];
       int j;
       printf("Veuillez taper deux nombres en les sÈparant d'un espace puis appuyez sur entrÈe");
       dup2 (p[1],1);
       close (p[0]); 
       close (p[1]);
       close (p2[1]);
      execl ("./lire","./lire",NULL);
      j = 0;
     
        while ( read (p2[0], &c2, 1) != 0 ){ 
          texte2[j++] = c2;
        }
        close(p2[0]);
        texte2[j-1] = 0;
        printf("L'addition des deux nombre donne %s", texte2);
    }
      else { // le pËre
        char texte[30]; 
        int i;
        close (p[1]);
        close (p2[0]); 
        i = 0;
        while ( read (p[0], &c, 1) != 0 ){
          texte[i++] = c; 
        }
        close(p[0]);
        texte[i-1] = 0;
       printf("les nombres sont %s", texte);
     
       dup2 (p2[1],1);
       close (p2[1]); 
       execl ("./calcul", "./calcul", texte); 
      }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Par défaut
    il y a quelque probleme dans votre programme...

    1 - vous ne devez pas utilizer dup2()
    2 - si vous souhaitez à convertir integet au string vous pouvez ajouter '0' a c2
    mais ca no marche pas si c2 est plus grand que 9. le meilleur choix est dutilizer sprintf() ou quelque chose comme ca
    3 - personne n'écrit sur p[1] donc p[0] est toujour vide
    4 - quel est la role de 'lire'?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Par défaut
    dans ce programme je lire des valeurs 'a' et 'b' du 'stdin' et je les ecris au p2[1]
    le fils lit ces valeur et evalue c=a+b, ensuite il ecrit 'c' dans p[1]
    j'ai utilizer select() pour multiplexage entre stdin et p[0]

    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
    91
    92
    93
    94
    95
    96
    97
     
    #include <sys/wait.h>
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
     
    int main()
    {
    	int p[2], p2[2];
     
    	if (pipe(p) == -1)
    	{
    		perror("pipe");
    		exit(EXIT_FAILURE);
    	}
    	if (pipe(p2) == -1)
    	{
    		perror("pipe");
    		exit(EXIT_FAILURE);
    	}
     
    	int cpid = fork();
    	if (cpid == -1)
    	{
    		perror("fork");
    		exit(EXIT_FAILURE);
    	}
     
    	if (cpid == 0)
    	{
    		printf("child\n");
    		char buffer[100];
    		close(p[0]);
    		while (read(p2[0], buffer, 100) > 0)
    		{
    			printf("read from p2[0]\n");
    			int a,b;
    			sscanf(buffer, "%d%d", &a, &b);
    			sprintf(buffer, "%d\n", a+b);
    			int size = write(p[1], buffer, strlen(buffer));
    			printf("%d bytes written on p[1]\n", size);
    			if (size == -1)
    				perror("write()");
    		}
    		printf("child end\n");
    		close(p2[0]);
    		close(p2[1]);
    	}
    	else
    	{
    		int a,b;
    		close(p2[0]);
     
    		fd_set rfds;
    		struct timeval tv;
    		int retval;
     
    		while (1)
    		{
    			FD_ZERO(&rfds);
    	                FD_SET(0, &rfds);
    	                FD_SET(p[0], &rfds);
     
    			retval = select(p[0]+1, &rfds, NULL, NULL, NULL);
     
    			if (retval == -1)
    				perror("select()");
    			else
    			{
    				if (FD_ISSET(0, &rfds))
    				{
    					printf("read from stdin\n");
    					char buffer[100];
    					scanf("%d %d", &a, &b);
    					sprintf(buffer, "%d %d\n", a, b);
    					int size = write(p2[1], buffer, strlen(buffer));
    					printf("%d bytes written on p2[1]\n", size);
    					if (size == -1)
    						perror("write()");
    				}
    				else if (FD_ISSET(p[0], &rfds))
    				{
    					printf("read from p[0]\n");
    					char buffer[100];
    					read(p[0], buffer, 100);
    					int c;
    					sscanf(buffer, "%d", &c);
    					printf("sum is %d\n", c);
    				}
    			}
    		}
    	}
     
    	return 0;
    }
    Je souhaite que cela peut vous aider.

    ATTENTION: c'est juste un exemple. il ya certains problèmes dans ce code

Discussions similaires

  1. Named pipe bidirectionnel
    Par haNjo dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 15/05/2013, 23h08
  2. BASH - PIPES bidirectionnel
    Par steven78700 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/11/2011, 14h47
  3. Fork et pipe
    Par Ylias dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/05/2006, 09h13
  4. Réponses: 1
    Dernier message: 07/04/2006, 13h35
  5. [PERL] Problème en essayant de comprendre fork et pipe
    Par LE NEINDRE dans le forum Langage
    Réponses: 6
    Dernier message: 04/10/2005, 15h23

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