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 :

Problème avec multi-pipes


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut Problème avec multi-pipes
    Bonjour,

    Comme quelques étudiants, je suis amené faire un shell qui doit bien évidemment gérer, entre autres, l'enchaînement des pipes entre divers processus exécutés.

    Pour être direct : Je n'arrive pas à faire marcher. Théoriquement, mon message "Done" ne devrait s'afficher qu'après le résultat du ls, or il s'affiche parfois avant, parfois après

    De plus le "less" fonctionne une fois sur 10, et en général pas correctement (en gros il affiche bien "END" pour noter la fin de ce qu'il a reçu par le pipe, mais est "écrasé" par le message Done).

    Désolé pour la solution crado retenue pour les exécutables et leurs arguments mais c'est évidemment que pour faire des tets

    Désolé également si ça compile pas. Je ne peux plus transférer de mon bsd a mon windows sans que ça corrompe ma clef J'ai donc dû tout taper à la main et évidemment ce copier coller est moins fiable que le bon vieux cp

    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
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int		do_pipe(int level)
    {
      char		*exe[] = {
        "/usr/bin/less",
        "/usr/bin/grep",
        "/bin/cat",
        "/bin/ls",
        NULL};
      char		*arg[5][3] = {
        {"less", NULL, NULL},
        {"grep", ".c", NULL},
        {"cat", "-e", NULL}, 
        {"ls", "-la", NULL},
        {NULL, NULL}
      };
      int		fd[2];
      int		pid;
     
      if (pipe(fd) < 0)
        {
          fprintf(stderr, "Pipe fail\n");
          exit(0);
        }
      if (exe[level + 1] != NULL)
        {
          pid = fork();
        if (pid == -1)
    	  {
    	    fprintf(stderr, "Fork fail\n");
    	    exit(0);
    	  }
        if (pid == 0)
      	  {
       	    close(fd[1]);
    	    dup2(fd[0], 0);
    	    close(fd[0]);
    	    execvp(exe[level], arg[level]);
    	  }
        else
    	  {
    	    close(fd[0]);
    	    dup2(fd[1], 1);
    	    close(fd[1]);
    	    do_pipe(level + 1);
    	  return (0);
    	  }
      }
      else 
      {
    	close(fd[0]);
    	execvp(exe[level], arg[level]);
      }
      return (0)
    }
     
    int		main()
    {
    	int		pid;
     
    	pid = fork();
    	if (pid == 0)
    		do_pipe(0);
    	else
    	{
    		waitpid(0, NULL, 0);
    		printf("Done\n");
    	}
    }
    Si quelqu'un a une idée, je suis preneur

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    J'ai l'impression que les problèmes de pipe n'intéressent pas grand monde ^^

    En cherchant sur le forum, j'ai trouvé ce topic:

    http://www.developpez.net/forums/d63...inement-pipes/

    J'ai appliqué à la lettre l'enchaînement proposé par matafan, sans succès

    Pourtant c'est la procédure que je vois a peu près partout, et qui semble être "la bonne". Manquerait-il quelque chose pour que cela fonctionne correctement ? Genre un "wait" quelque part ?

  3. #3
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Va au lab astek ?

    EDIT: tu n'as pas lu le man de printf visiblement Utilises un my_putstr.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par ironzorg Voir le message
    Va au lab astek ?

    EDIT: tu n'as pas lu le man de printf visiblement Utilises un my_putstr.
    Marche très bien mes printf :p

  5. #5
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Citation Envoyé par Shuny Voir le message
    Désolé également si ça compile pas. Je ne peux plus transférer de mon bsd a mon windows sans que ça corrompe ma clef J'ai donc dû tout taper à la main et évidemment ce copier coller est moins fiable que le bon vieux cp
    Tu aurai pu utiliser putty (installe sur les dumps) et un server ssh.

    Pour ton probleme:
    +Ne lance pas les redirections dans un process fils, si l'utilisateur rentre une command super longue tu fais l'equivalent d'un fork bomb (dans la logique de 'gestion d'une infinite de pipes').
    +Si tu fais une redir dans le process fils, il te faudra soit un autre pipe entre le process pere et le process fils pour qu'ils puissent communiquer et qu'ainsi le fils puisse acceder en 'ecriture' aux donnees du pere.

    Je vois pas trop pour ton probleme d'ou ca vient...

Discussions similaires

  1. Problèmes avec les Pipes et createprocess
    Par olivier37300 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/07/2012, 19h24
  2. Problèmes avec les pipes
    Par awabi dans le forum Langage
    Réponses: 4
    Dernier message: 10/10/2008, 18h24
  3. Problème avec la multi-sélection dans une zone de liste
    Par Mimisio dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/07/2007, 16h23
  4. Réponses: 11
    Dernier message: 14/02/2006, 00h26
  5. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00

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