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

Réseau C Discussion :

Comment traiter correctement EINTR?


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut Comment traiter correctement EINTR?
    Bonjour à tous,

    Je suis sous Linux (Fedora 14).
    Je réalise une application client/serveur TCP/IP.

    Parfois coté client je reçois l'erreur "L’appel a été interrompu par un signal." sur select.

    Pour contourner l'erreur je fais:

    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
     
    ...
    else if (ret < 0)
    {
          perror("select");
     
           if (errno == EINTR)
           {
                 continue;
           }
     
           kill(Fils_Un, SIGINT);
           kill(Fils_Deux, SIGINT);
           exit(EXIT_FAILURE);   
    }
    Je ne pense pas que traiter l'erreur avec continue soit la bonne solution.

    Pouvez-vous m'indiquer comment traiter efficacement cette erreur?
    Est-il possible de connaitre le signal qui provoque cette erreur?
    Faut-il utiliser sigaction avec SA_RESTART?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Bundy*Al Voir le message
    Pouvez-vous m'indiquer comment traiter efficacement cette erreur?
    Rappeler select() tout simplement.
    Citation Envoyé par Bundy*Al Voir le message
    Est-il possible de connaitre le signal qui provoque cette erreur?
    Franchement je ne sais pas, mais ça changerait quoi ?
    Citation Envoyé par Bundy*Al Voir le message
    Faut-il utiliser sigaction avec SA_RESTART?
    C'est une possibilité oui, tu peux aussi utiliser la macro TEMP_FAILURE_RETRY (ce n'est rien d'autre qu'une boucle englobant l'appel système que tu lui passes.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonsoir,

    Citation Envoyé par Bundy*Al Voir le message
    Je ne pense pas que traiter l'erreur avec continue soit la bonne solution. Pouvez-vous m'indiquer comment traiter efficacement cette erreur?
    En fait, si. Mais d'une manière générale, tous les appels bloquants peuvent être interrompus par des signaux. Donc, il faut coder en conséquence. Étant donné que les appels systèmes bloquants qui ne peuvent échouer pour quelque raison que ce soit sont extrêmement rares, on peut ranger l'arrivée d'un signal dans la gestion des erreurs ordinaires.

    Est-il possible de connaitre le signal qui provoque cette erreur?
    … cela dit, visiblement, les appels systèmes ne sont interrompus qu'à partir du moment ou un gestionnaire de signal est invoqué. Apparemment, les signaux ignorés, par défaut ou avec SIG_IGN n'ont pas d'effet sur les appels système en cours. Et si un signal n'est ni ignoré ni pris en charge, il tue le processus.

    Donc, en principe, tu sais forcément quel/quels signal/signaux a/ont été reçus puisque les gestionnaires concernés ont été invoqués.

    Faut-il utiliser sigaction avec SA_RESTART?
    Selon man 7 signal, un certain nombre d'appels système sont exclus du domaine de cette facilité, et select() en fait partie. Donc, la réponse est non, dans ce cas précis.

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    J'aurais dû préciser (comme l'a fait juste en haut Obsidian) que dans ce cas précis (un système GNU/Linux) select() retournera toujours EINTR si elle est interrompue et ceux sans tenir compte du drapeau SA_RESTART, mais sinon ce comportement est implementation-defined :
    Citation Envoyé par IEEE Std 1003.1-2008
    NAME
    pselect, select - synchronous I/O multiplexing
    <...>
    [EINTR]
    The function was interrupted before any of the selected events occurred and before the timeout interval expired.

    If SA_RESTART has been set for the interrupting signal, it is implementation-defined whether the function restarts or returns with [EINTR].

  5. #5
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut
    Bonsoir,

    J'en conclus donc que le mieux est de conserver la solution exposée dans mon premier post.

    Merci à tous les 2 pour toutes ces infos.

    A+

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

Discussions similaires

  1. [SimpleXML] Comment traiter correctement simple XML avec du PHP ?
    Par Alexandrebox dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 14/12/2009, 14h30
  2. [CSS] Positionnement float, comment clearer correctement ?
    Par Séb. dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 02/11/2005, 16h35
  3. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    Réponses: 2
    Dernier message: 29/09/2005, 09h56
  4. [Séquence] Comment traiter la concurrence ?
    Par ouharte dans le forum Autres Diagrammes
    Réponses: 3
    Dernier message: 17/08/2005, 19h31
  5. [VB.NET] Page Edition, comment traiter les <br?
    Par zigoto dans le forum ASP.NET
    Réponses: 12
    Dernier message: 08/02/2005, 17h05

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