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

POSIX C Discussion :

Lecture d'un pipe de façon non-bloquante


Sujet :

POSIX C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Lecture d'un pipe de façon non-bloquante
    Salut,

    est-ce que quelqu'un pourrait m'indiquer comment on fait pour lire un pipe de façon non-bloquante
    Un exemple serait le bienvenue

    Merci

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    je te conseilles d'utiliser select().

    select() est une fonction quasi-incontournable dans le developpement reseau.

    Elle permet de connaitre l'etat de tes files descriptors.
    En clair de savoir si il y a actuellement des donnees a lire et a ecrire dessus.

    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
     
    #include <sys/select.h>
    #include <time.h>
     
    void          my_func(int fd, int fd2)
    {
      fd_set                read_mask;
      fd_set                write_mask;
      struct timeval        tempo;
      int                   rsel;
     
      FD_ZERO(&read_mask);
      FD_ZERO(&write_mask)
      FD_SET(fd, &read_mask);
      FD_SET(fd2, &write_mask)
    /*
    ** La tu ajoutes d'autres fd.
    */
     
     
      tempo.tv_sec = NB_SEC;
      tempo.tv_usec = NB_USEC;
      rsel = select(MAX_FD + 1 , &read_mask, &write_mask, NULL, &tempo);
      if (rsel)
        {
           if (FD_ISSET(fd)
             {
             }
           if (FD_ISSET(fd2)
             {
             }
    /*
    ** Etc....
    */
        }
      return ;
    }
    Explication :

    Au debut tu defini les fd a verifier dans deux champs de type fd_set.
    Tu defini un timeout. Si il est a 0, select est totalement non-bloquant. Si tu utilises NULL, select est totalement bloquant.
    Tu appelles select.
    Lis le man pour plus d'explications, mais select se debloque a la fin du timeout, en te retournant le nombre de fd disponibles en lecture/ecriture.

    Ensuite tu verifies les fd dans tes masks avec la macro FD_ISSET.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Salut,

    merci pour ce code mais je ne fais pas de réseau

    Est-ce que tu aurais un exemple avec la lecture de pipe non-bloquant.

    Merci

  4. #4
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Premium
    Salut,

    merci pour ce code mais je ne fais pas de réseau

    Est-ce que tu aurais un exemple avec la lecture de pipe non-bloquant.

    Merci
    Un pipe est un un fd comme un autre.

    fd => file descriptor.

    D'ailleurs les exemples d'utilisation de pipe sur le net sont courants.
    Note: penser a preciser sa recherche sur Google, et de preference en anglais. taper pipe c'est dangereux. On tombe sur de ces choses....

    la fonction pipe(2) te revoie une paire de fd.
    Select(2) attend des champs de fd en parametres.

    Mon allusion en reseau etait purement informative.

    Sinon tu peux aussi regarder du cote de fcntl(2). C'est la fonction utilisee pour manipuler les files desciptors.

    On peut les rendre non bloquant avec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void     test_func() 
    {
       int    fd_tab[2];
     
       pipe(fd_tab);
        if (fcntl(fd_tab[0], F_SETFL, O_NONBLOCK) == -1)
        {
             /* Traitement de l'erreur */
        }
     
    /*
    ** ...
    */
    Du moins je crois.

    Lis le man de fcntl(2) si tu prefere cette solution.
    Mais je te previens il est assez touffu.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    ben pareil, tu remplace le socket par une pipe si tu est sous linux ... sous windows la foncton select ne marche QUE sur le sockets. (sont bizzarre chez M$)
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Dark_Ebola
    ben pareil, tu remplace le socket par une pipe si tu est sous linux ... sous windows la foncton select ne marche QUE sur le sockets. (sont bizzarre chez M$)
    Oups.

    Zavai oublie Windows. Suis desole. Le ferais plus promis...
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jack_serious
    Oups.

    Zavai oublie Windows. Suis desole. Le ferais plus promis...
    WaitForMultipleObjects()
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 22/11/2008, 13h50
  2. Lecture non bloquante sur plusieurs Sockets avec nio
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 19/04/2007, 16h14
  3. lecture stdin non bloquante et temps de saisie
    Par TabrisLeFol dans le forum C
    Réponses: 10
    Dernier message: 29/11/2006, 16h46
  4. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  5. Réponses: 3
    Dernier message: 16/03/2004, 16h42

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