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 :

J'ai cassé ma pipe !


Sujet :

C++

  1. #1
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut J'ai cassé ma pipe !
    Bonjour,

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string ligne;
     
    while ( ! getline(cin, ligne).eof() ) {
            // Traitement de ligne
            //(...)
            if ( condition ) {
                    break;
            }
    }
    J'appelle le programme tel que : john --incremental --stdout | ./programme.

    Le but étant de traiter un liste de mots (ici j'utilise john comme j'aurai pu utiliser seq, cat, crunch ou autre).
    Mais je peux arrêter le traitement en cours si certaines conditions sont valides, ce qui fait que le premier programme (john --incremental --stdout) s'arrête avec une erreur du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zsh: broken pipe  john --incremental --stdout |
    Y a t-il un moyen d'outrepasser cette erreur ? Ou peut être de faire une sorte de cin.close() ou quelque chose pour lui dire d'arrêter de lire depuis std::cin sans erreur.

    J'ai essayé avec un booléen mais ça ne change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string ligne;
    bool stop = false;
     
    while ( ! getline(cin, ligne).eof() && ! stop ) {
            // Traitement de ligne
            //(...)
            if ( condition ) {
                    stop = true;
            }
    }
    Merci d'avance pour vos réponses.

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    John est lancer en parallèle avec ton programme, et quand tu creer un pipe, les deux deveinne lié, il faut donc que ton programme john se finisse AVANT ton programme qui lit la sortie de john.

    La solution pourrait être de continuer à lire l'entrée standard jusqu'a sa fermeture dans ton 2ème programme. Comme ça, lors de la fermeture du premier, le deuxième s'arrètera tout seul .

    En gros rajoute un boucle qui sert a rien mais vide le buffer d'entrée pour éviter un broken pipe.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Admettons que john ait plusieurs milliards de permutations restantes, mon programme risque de mettre une plombe avant de quitter.

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Effectivement mais le principe des pipe c'est de lire la sortie standard et d'attendre qu'il termine, tu utilise sa pour faire quoi au juste? car c'est peut-etre pas la bonne methode?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Je m'en sers pour faire du brute force. Je ne souhaite pas m'occuper de la partie génération de mots, pour ça il y a pléthore d'outils.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Beh plutot que de t'en servir de cette meniere, tu devrait appeler john depuis ton programme, avec un execve par exemple.
    Tu relis la sortie standard de john avec ton programme, comme ça c'est ton programme qui reste maître et non pa john.
    Quand tu obtiens ce que tu veux, tu envois un signal a john pour qu'il s'arrete, normalement ça devrait marché de cette manière.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


Discussions similaires

  1. recherche Xpath: problème de casse (majuscule/minuscule)
    Par alexandre54 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 29/07/2003, 10h42
  2. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 11h06
  3. la casse
    Par wello00 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/07/2003, 08h53
  4. Tri insensible à la casse [IB7]
    Par patquoi dans le forum Débuter
    Réponses: 4
    Dernier message: 02/06/2003, 08h56
  5. Pas de casse dans les XML
    Par :GREG: dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 13h51

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