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 :

alarm affiche "Minuterie d'alerte"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut alarm affiche "Minuterie d'alerte"
    Bonjour à tous,

    Pour un projet de serveur TFTP, je dois faire un recvfrom avec un timeout. Pour cela, j'utilise la fonction alarm pour envoyer un SIGALRM et stopper la fonction recvfrom qui est bloquante.
    Le problème c'est qu'à l'arrivée du signal, j'ai un "Minuterie d'alerte" qui s'affiche dans le terminal, c'est chiant. De plus, la fonction recvfrom devrait me retourner -1, non ?

    Voici le code en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    alarm(timeout);
     
    ssize_t count = recvfrom(sock->sockfd, buffer, length, 0, &sockaddr, &sockaddr_len);
     
    return count;
    Pouvez-vous m'aider ?

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Bonjour,
    Je ne connais pas tellement *n*x, mais as-tu installé un handler pour SIGALRM?
    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 habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    Bonjour,

    Non, pas de handler pour SIGALRM. J'en ai pas eu besoin, la fonction recvfrom s'arrête bien dès la réception du signal.
    Donc je pense que le message est envoyé par le noyau.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Le souci c'est que sans handler utilisateur, le handler par défaut sera invoqué. Et je crois me souvenir que pour SIGALRM c'est la fin du processus.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    Citation Envoyé par Booggi Voir le message
    Non, pas de handler pour SIGALRM. J'en ai pas eu besoin, la fonction recvfrom s'arrête bien dès la réception du signal.
    Donc je pense que le message est envoyé par le noyau.
    Citation Envoyé par Matt_Houston Voir le message
    Le souci c'est que sans handler utilisateur, le handler par défaut sera invoqué. Et je crois me souvenir que pour SIGALRM c'est la fin du processus.
    Ce que Matt_Houston t'explique, c'est que lorsqu'un processus reçoit un signal sans le rattraper, soit ce signal est ignoré, soit il tue le processus (cas le plus fréquent) car il s'agit d'un événement système extérieur nécessitant une intervention particulière de la part de ce processus, et que celui-ci n'est a priori pas prévu pour le traiter s'il n'a pas installé de handler.

    Tu as donc l'impression que ton programme se comporte normalement, à part le code de retour et le message à l'écran mais en fait, il meurt totalement avant la fin. Seulement, comme il n'y a rien entre ton recvfrom() et le return final, tu ne t'en rends pas compte.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Par défaut
    D'accord, compris.

    Donc voici mon code pour attraper mon signal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct sigaction act;
    act.sa_handler = handleAlarm;
    act.sa_flags = 0;
     
    if (sigemptyset(&act.sa_mask) != 0) {
      return -1;
    }
     
    if (sigaction(SIGALRM, &act, NULL) != 0) {
      return -1;
    }
    Et ma fonction exécutée quand SIGALRM débarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void handleAlarm(int sig) {
      if (sig == SIGALRM) {
        // Timeout, nothing to do
      }
    }
    Elle ne fait absolument rien, parce que je n'ai rien à faire quand j'ai un SIGALRM, juste arrêter la fonction recvfrom.

    Donc tout marche à merveille.

    Merci beaucoup et bonne fin de journée.

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

Discussions similaires

  1. Afficher un message d'alerte si plus de 5 checkbox cochés
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 07/08/2007, 12h06
  2. Afficher un message d'alerte dès que la sixième case est cochée
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/01/2007, 17h03
  3. Réponses: 9
    Dernier message: 24/03/2004, 12h15

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