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

Windows Discussion :

pipes anonymes et ReadFile()


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut pipes anonymes et ReadFile()
    dans la documentation msdn de Reafile(), il est indiqué, concernant les pipes nommées, ce qu'il faut faire quand le buffer passé en paramètre est trop petit par rapports aux données qui arrivent :

    "If a named pipe is being read in message mode and the next message is longer than the nNumberOfBytesToRead parameter specifies, ReadFile returns FALSE and GetLastError returns ERROR_MORE_DATA. The remainder of the message can be read by a subsequent call to the ReadFile or PeekNamedPipefunction."

    Par contre, dans la ligne au dessus, rien n'est dit concernant le même cas pour les pipes anonymes. Est-ce que je dois aussi tester l'erreur ERROR_MORE_DATA (s'il y a erreur) et faire aussi autant d'appels que nécessaire pour lire la totalité des données ?

    Autre question : est-ce que ReadFile() peut retourner ERROR_IO_PENDING avec des pipes anonymes ?

    merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    À ma connaissance, les tubes anonymes ne peuvent pas être "in message mode", et je ne sais même pas s'il y a moyen de savoir qu'il y a ou non des données dans le tube.

    Pour ces raisons je trouve ça nul, un tube anonyme: Un socket (ou un tube nommé) peut être préférable dans bien des cas.

    Edit: Vu que sous NT, un tube anonyme est juste un tube nommé avec un nom unique, peut-être que PeekNamedPipe() marche dessus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    mon but est la redirection des entrées/sorties (stdin, stdout, stderr), et apparemment, msdn dit que pour ça, on peut utiliser les tubes anonymes.

    Si un tube anonyme est en fait nommé avec un nom unique, il doit y avoir le même comportement (sous NT, ce qui est de toute façon la version minimale que je supporte).

    En gros, ce que je fais:

    1) je crée un event manuel (état non signalé) que je mets dans un OVERLAPPED et je le fais attendre dans ma boucle principale avec WaiForMultipleObjects(). Dès que WaiForMultipleObjects() ne bloque plus, un callback est appelé.
    2) je crée mes pipes anonymes
    3) dans un thread, j'appelle dans une boucle sans fin ReadFile() avec l'OVERLAPPED et une extremite du tube ci-dessus
    4) quand une donnée arrive, j'appelle GetOverlappedResult. Celui-ci met l'event dans l'état signalé et WaiForMultipleObjects() ne bloque plus, et mon callback est appelé. C'est dedans que je fais tout ce que je dois faire.

    Mes questions portaient donc sur les valeurs possibles de retour de ReadFile() avec les tubes anonymes.

    Est-ce que ce que j'ai décrit est raisonnable ?

    merci

    Edit: msdn dit : "Asynchronous (overlapped) read and write operations are not supported by anonymous pipes. This means that you cannot use the ReadFileEx and WriteFileEx functions with anonymous pipes. In addition, the lpOverlapped parameter of ReadFile and WriteFile is ignored when these functions are used with anonymous pipes."

    donc je suis mal parti...

    Edit2 : pas le choix, je dois faire du synchrone. Merci pour les réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. help pipe anonyme avec un processus
    Par airone76 dans le forum Windows
    Réponses: 1
    Dernier message: 06/06/2012, 09h42
  2. pipe anonyme et WaitForMultipleObjects
    Par d'Oursse dans le forum Windows
    Réponses: 8
    Dernier message: 19/02/2010, 15h51
  3. [IPC: Anonymous pipe] nombre de bytes
    Par ZaaN dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/07/2007, 09h47
  4. [IPC: anonymous pipe] mauvais HANDLE
    Par ZaaN dans le forum Visual C++
    Réponses: 4
    Dernier message: 06/02/2007, 09h41
  5. [IPC: anonymous pipe] fonctionnement
    Par ZaaN dans le forum MFC
    Réponses: 4
    Dernier message: 30/01/2007, 08h29

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