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 :

Tubes nommés (named pipes) asynchrones


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut Tubes nommés (named pipes) asynchrones
    Bonjour,

    J'ai utilisé les tubes nommés dans un petit projet sous linux pour communiquer entre deux processus. Tout fonctionne bien, mais de façon synchrone.
    En effet, mon programme s'arrête en attendant que des données soit reçues dans le pipe.
    Est-ce qu'il existe un moyen simple de rentre cette communication asynchrone?

    Merci d'avance pour votre aide !

    Salutations

    Piziwate

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Si c'est un pipe pour comminication entre pere et fils, je sais pas.. Si c'est un named pipe (fichier dans le systeme de fichier), je sais que ya une option dans open() pour ça.. => O_NONBLOCK
    http://man.developpez.com/man2/open.2.php
    Attention c'est pas tous les systemes de fichiers qui peuvent le gérer (ex : nfs)

    Je sais pas quelle est ta problematique mais pour une application assimilable à un serveur, la technique courante est de faire un thread pour la reception des commandes et d'autres threads pour le traitement des commandes..
    Une autre technique consiste à utiliser select() (tutoriels trouvables sur le web)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Une autre technique consiste à utiliser select() (tutoriels trouvables sur le web)
    Je ne comprends pas ce que tu entends par ?

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    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 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par piziwate Voir le message
    Bonjour,

    J'ai utilisé les tubes nommés dans un petit projet sous linux pour communiquer entre deux processus. Tout fonctionne bien, mais de façon synchrone.
    En effet, mon programme s'arrête en attendant que des données soit reçues dans le pipe.
    Normal. C'est le noyau qui gère ça. Tout processus écrivain est bloqué tant qu'un lecteur n'est pas venu consommer les données du pipe (et inversement). Ce mécanisme permet de programmer de façon simple des files d'attentes pour des périphériques exclusifs (comme des imprimantes). Un processus (lpd) lit le pipe et envoie les données dans l'imprimante et un autre (lpr) prend le fichier à imprimer et l'envoie dans le pipe. Et tant que l'ensemble n'est pas fini aucun autre fichier ne peut entrer dans le pipe (ça évite que les pages se mélangent)

    Citation Envoyé par piziwate Voir le message
    Est-ce qu'il existe un moyen simple de rentre cette communication asynchrone?
    Le flag O_NONBLOCK mais c'est dangereux car t'as plus aucun contrôle. Si tu lis pas faut que tu gères si la cause de la "non-lecture" est due parce qu'il n'y a rien à lire ou parce qu'il y a une erreur.

    Généralement, si t'as besoin de transférer des infos en asynchrone il est plus courant d'utiliser les ipcs (msgctl()). C'est le noyau qui se charge de conserver les données et de les distribuer à qui possède la clef
    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]

  6. #6
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Y'a aussi fcntl (man fcntl)
    fcntl(pipe[0],F_SETFL,O_NONBLOCK);
    Compil your life guy!
    The Aures Project

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    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 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Goundy Voir le message
    Y'a aussi fcntl (man fcntl)
    fcntl(pipe[0],F_SETFL,O_NONBLOCK);
    Il parle de tubes "nommés" donc c'est pas des tubes "mémoire" !!!
    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]

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut
    Hello,

    Merci pour vos réponses, en effet je parle bien des tubes nommés car mes deux processus ne sont pas parents (il s'agit d'un agent SNMP et d'un daemon qui gère des E/S).
    Donc théoriquement, si j'ai bien compris vos propositions, il faudrait que la gestion de la transmission soit effectuée via les threads pour que le reste des fonctionnalités continuent de tourner normalement. Et l'option "Non bloquante" est pas vraiment recommendée !

    Merci pour votre débat !

    Salutations

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    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 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par piziwate Voir le message
    Donc théoriquement, si j'ai bien compris vos propositions, il faudrait que la gestion de la transmission soit effectuée via les threads pour que le reste des fonctionnalités continuent de tourner
    Non pas forcément. Tu peux passer aussi par les IPCS qui sont totalement asynchrones. Un émetteur place un message dans une file et un lecteur va chercher un message quand il a envie. C'est de type fifo comme un pipe et assez souple d'emploi. Et ça évite les thread...
    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. Named Pipes - event
    Par Brosske dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 09/11/2007, 11h26
  2. Named Pipes sur vista
    Par Tosh dans le forum C++
    Réponses: 1
    Dernier message: 18/07/2007, 21h28
  3. Create named pipe
    Par albanovisch dans le forum C++
    Réponses: 3
    Dernier message: 06/07/2007, 09h07
  4. tube nommé en C
    Par yann999 dans le forum POSIX
    Réponses: 7
    Dernier message: 24/11/2006, 11h10
  5. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11

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