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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    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 495
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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..

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 42
    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 éclairé

    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 : 44
    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
    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 ...

+ 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