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 :

Timers et signaux


Sujet :

POSIX C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    Points : 25
    Points
    25
    Par défaut Timers et signaux
    Bonjour,

    J'ai une question à propos des signaux sous Linux... Voilà, j'ai créé des timers qui génèrent un signal SIGUSR1 une fois arrivés à échéance. Une fois ce signal généré, une fonction "handler" de mon crue est exécutée et, réalise le traitement dont j'ai besoin...

    Ce que j'aimerai faire maintenant, c'est "déconnecter" cette fonction "handler" quand je le souhaite, sans supprimer mes timers, c'est-à-dire avoir la possibilité de laisser mes timers arriver à échéance mais que le handler ne s'exécute plus... Et plus tard, éventuellement le "reconnecter".

    J'ai regardé le man et j'ai trouvé plusieurs fonctions qui me semblent utiles : sigsuspend, siginterrupt... Malheureusement, je me perds un peu dans leur description et je ne sais pas laquelle pourrait vraiment réaliser ce que je souhaite...

    Quelqu'un a une idée ?

    Merci,

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Je suppose que tu as utilisé sigaction() ou signal() pour mettre ton handler en place. Tu peux utilises les macors SIG_IGN et SIG_DFL pour ignorer le signal ou restaurer le handler par défaut. Regarde la man-page consacrée.

    Vois aussi du côté de alarm() qui sert à faire ce que tu cherches à faire.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    Oui, j'ai en effet utilisé sigaction pour connecter le handler à la réception du signal.

    J'avais pas vu que l'on pouvait réutiliser sigaction avec SIG_IGN pour ignorer l'arrivée du signal...

    Par contre, je préfère utiliser timer_create au lieu de alarm car j'ai besoin de "vrais" timers.

    Merci pour ton aide,

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Akutabi Voir le message
    Par contre, je préfère utiliser timer_create au lieu de alarm car j'ai besoin de "vrais" timers.
    c'est quoi pour toi un "vrai" timer ??

    Sinon, pour le problème de base, ce que je fais moi, c'est utiliser alarm, stocker une structure TimerStruct contenant la callback, le delai, eventuellement l'adresse de la structure data à passer.

    Et ayant ça, j'ai une petite biblio RegisterTimer, UnregisterTimer, DelayTimer.. Et tu peux pour ton cas ajouter "InhibitTimer" (ou tu peux le faire via le Delay)...

    Quand j'enregistre (ou désenregistre), je calcule le prochain pas d'expiration (1 seul), et je sette alarm.

    A chaque expiration, je passe à travers mon tableau , appelle l'ensemble des callbacks de l'ensemble des timers expirés, ré-ajuste les nouveaux appels, et re-calcule la nouvelle expiration, puis resette alarm..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    C'est à peu de choses près ce que j'ai fait sauf que j'utilise timer_create mais bon, ça revient au même...^^

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    c'est quoi pour toi un "vrai" timer ??
    Bonne question ? C koi pour toi un vrai timer ?

    Non ça ne revient pas au même, vous n'utilisez par le même type de timer : le tien vient de l'extension RT via la librt et est compatible POSIX, alors que son mécanisme de timer lui utilise une des (trois ?) temporisations allouée à chaque processus. Ces deux timer n'ont probablement pas la même résolution.
    Avec cela vous n'utilisez pas le même signal. Au passage, à moins que je dise une sottise je trouve dommage d'utiliser un signal non temps-réel avec un timer qui l'est, du coup tu ne peux empiler plus de deux signaux.
    Ca en fait des différences non ?

    Après ça tu souhaites inhiber le signal ou le timer ? Je pense que le mieux reste d'inhiber le timer pour éviter des changements de contexte du processus pour rien.
    Je suppose que tu as configuré ton timer pour qu'il claque périodiquement.
    Peux-tu essayer cette méthode : changer la période pour la mettre à zéro et l'appliquer à ton timer. Ainsi ton objet existe toujours mais restera inactif.
    Voici vite fait une fonction :
    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
     
    /*!
     * Annulation du watchdog timer
     *
     * \param pTimer [out] structure du watchdog timer mise a jour
     *
     * \return code de retour de la fonction
     * \retval OK retour OK
     * \retval ERROR retour avec erreur
     *
     */
    int32 tmCancel(T_TIMER * pTimer)
    {
            struct itimerspec itimer ;
     
            if(pTimer != 0)
            {
                    /* Program starts here */
                    itimer.it_value.tv_sec = 0;
                    itimer.it_value.tv_nsec = 0;
                    itimer.it_interval.tv_sec = 0;
                    itimer.it_interval.tv_nsec = 0;
     
                    //Errno update
                    return timer_settime(pTimer->timer, 0, & itimer, 0);
     
            }
     
            return ERROR;
    }
    En fait j'ai fait une lib a partir des timer de la librt qui permet de ne plus s'occuper des signaux mais je ne l'ai pas complètement testé donc ...
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par bizulk Voir le message
    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
     
    /*!
     * Annulation du watchdog timer
     *
     * \param pTimer [out] structure du watchdog timer mise a jour
     *
     * \return code de retour de la fonction
     * \retval OK retour OK
     * \retval ERROR retour avec erreur
     *
     */
    int32 tmCancel(T_TIMER * pTimer)
    {
            struct itimerspec itimer ;
     
            if(pTimer != 0)
            {
                    /* Program starts here */
                    itimer.it_value.tv_sec = 0;
                    itimer.it_value.tv_nsec = 0;
                    itimer.it_interval.tv_sec = 0;
                    itimer.it_interval.tv_nsec = 0;
     
                    //Errno update
                    return timer_settime(pTimer->timer, 0, & itimer, 0);
     
            }
     
            return ERROR;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tmCancel(T_TIMER * const Timer)
    {
       return (Timer != NULL) ? timer_settime(Timer->timer, 0, &(const struct itimerspec){0}, NULL) : ERROR;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

Discussions similaires

  1. [Amstrad] Signaux à gérer port E/S pour lire ROM
    Par Masterglob dans le forum Autres architectures
    Réponses: 7
    Dernier message: 12/01/2005, 12h03
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

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