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

Linux Discussion :

segfault causée par sigalarm ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Par défaut segfault causée par sigalarm ?
    Bonjour à tous,

    j'exécute une séquence de calcul toutes les 10ms. Afin d'avoir une bonne précision de temps au niveau de la boucle de calcul, j'ai réglé un timer (via setitimer) qui est responsable de l'émission d'un signal SIGALRM récupéré par une routine qui incrémente un compteur. Dès que ce compteur est incrémenté, on recommence les calculs. Une fois terminé, on se met en pause() et on attend que le timer arrive à 0 à nouveau, pour réémettre un SIGALRM qui incrémentera à nouveau le compteur etc... En bref, voici le code :


    void IncrementLoop () // signal
    {
    k=k+1;
    }

    struct itimerval controlloop;
    struct timeval delay, offset;

    int main(int argc, char *argv[])
    {

    delay.tv_sec = 0;
    delay.tv_usec = 10000;
    offset.tv_sec = 0;
    offset.tv_usec = 100;
    controlloop.it_interval = delay;
    controlloop.it_value = offset;

    setitimer(ITIMER_REAL,&controlloop,NULL);
    signal(SIGALRM, IncrementLoop);

    k = 0;
    kold = 0;

    while(flag == 1) {

    while(k == kold) pause();
    kold = k;

    /* séquence de calculs qui va modifier le flag si nécessaire pour sortir
    de cette boucle de calcul */

    }

    }


    Ce programme fonctionne, mais il a la mauvaise habitude de parfois générer une SEGFAULT et de se couper en plein milieu de la boucle de calcul... A la compilation, il n'y pas d'erreurs. J'ai égalament utilisé Valgrind pour débugger, mais cela ne m'a rien apporté comme informations supplémentaires.
    Ce que j'aimerais savoir, c'est si le temps de calcul dépasse les 10ms réglés avec le timer, est-ce que ça pourrait générer l'erreur de segmentation et faire planter le programme ?

    Je suis nouveau sur le forum, s'il manque des infos n'hésitez pas à me le signaler.
    Merci

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Ce code ne compile pas:
    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
    newmain.c:3: erreur: ‘k’ undeclared (first use in this function)
    newmain.c:3: erreur: (Each undeclared identifier is reported only once
    newmain.c:3: erreur: for each function it appears in.)
    newmain.c: In function ‘main’:
    newmain.c:12: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:13: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:14: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:15: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:16: erreur: invalid use of undefined type ‘struct itimerval’
    newmain.c:17: erreur: invalid use of undefined type ‘struct itimerval’
    newmain.c:19: attention : implicit declaration of function ‘setitimer’
    newmain.c:19: erreur: ‘ITIMER_REAL’ undeclared (first use in this function)
    newmain.c:19: erreur: ‘NULL’ undeclared (first use in this function)
    newmain.c:20: attention : implicit declaration of function ‘signal’
    newmain.c:20: erreur: ‘SIGALRM’ undeclared (first use in this function)
    newmain.c:22: erreur: ‘k’ undeclared (first use in this function)
    newmain.c:23: erreur: ‘kold’ undeclared (first use in this function)
    newmain.c:25: erreur: ‘flag’ undeclared (first use in this function)
    newmain.c:27: attention : implicit declaration of function ‘pause’
    newmain.c:35: attention : control reaches end of non-void function
    newmain.c: Hors de toute fonction :
    newmain.c:9: attention : unused parameter ‘argc’
    newmain.c:9: attention : unused parameter ‘argv’

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Ce code ne compile pas:
    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
    newmain.c:3: erreur: ‘k’ undeclared (first use in this function)
    newmain.c:3: erreur: (Each undeclared identifier is reported only once
    newmain.c:3: erreur: for each function it appears in.)
    newmain.c: In function ‘main’:
    newmain.c:12: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:13: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:14: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:15: erreur: invalid use of undefined type ‘struct timeval’
    newmain.c:16: erreur: invalid use of undefined type ‘struct itimerval’
    newmain.c:17: erreur: invalid use of undefined type ‘struct itimerval’
    newmain.c:19: attention : implicit declaration of function ‘setitimer’
    newmain.c:19: erreur: ‘ITIMER_REAL’ undeclared (first use in this function)
    newmain.c:19: erreur: ‘NULL’ undeclared (first use in this function)
    newmain.c:20: attention : implicit declaration of function ‘signal’
    newmain.c:20: erreur: ‘SIGALRM’ undeclared (first use in this function)
    newmain.c:22: erreur: ‘k’ undeclared (first use in this function)
    newmain.c:23: erreur: ‘kold’ undeclared (first use in this function)
    newmain.c:25: erreur: ‘flag’ undeclared (first use in this function)
    newmain.c:27: attention : implicit declaration of function ‘pause’
    newmain.c:35: attention : control reaches end of non-void function
    newmain.c: Hors de toute fonction :
    newmain.c:9: attention : unused parameter ‘argc’
    newmain.c:9: attention : unused parameter ‘argv’
    t'as mis les include qu'il faut?

  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 bombledq Voir le message
    Ce programme fonctionne, mais il a la mauvaise habitude de parfois générer une SEGFAULT et de se couper en plein milieu de la boucle de calcul... A la compilation, il n'y pas d'erreurs. J'ai égalament utilisé Valgrind pour débugger, mais cela ne m'a rien apporté comme informations supplémentaires.
    Ce que j'aimerais savoir, c'est si le temps de calcul dépasse les 10ms réglés avec le timer, est-ce que ça pourrait générer l'erreur de segmentation et faire planter le programme ?

    Je suis nouveau sur le forum, s'il manque des infos n'hésitez pas à me le signaler.
    Merci
    Pourquoi faire simple quand on peut faire compliqué

    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
    int k = 0 ;
    struct itimerval controlloop;
    struct timeval delay, offset; 
     
     
    void IncrementLoop () // signal
    {
    	k = (k + 1) % 2;
    }
     
    int main(int argc, char *argv[])
    {
     
    	delay.tv_sec = 0;
    	delay.tv_usec = 10000;
    	offset.tv_sec = 0; 
    	offset.tv_usec = 100;
    	controlloop.it_interval = delay;
    	controlloop.it_value = offset; 
     
                signal(SIGALRM, IncrementLoop);
               setitimer(ITIMER_REAL,&controlloop,NULL);
     
            for ( ; ; )
             {
                sleep(99999);
     
                  /* séquence de calculs qui va modifier le flag si nécessaire pour sortir
                         de cette boucle de calcul  */
     
                signal(SIGALRM, IncrementLoop);
            }
    }

  5. #5
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Pourquoi faire simple quand on peut faire compliqué
    eu ce ne serait pas l'inverse ?

  6. #6
    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 publicStaticVoidMain Voir le message
    eu ce ne serait pas l'inverse ?


    c'est à dire ?

    Si c'est la phrase, elle est correcte : c'est le raisonnement suivi non dans mon programme, mais dans la réflexion initiale ..

    Sous-entendu : "pourquoi aller chercher midi à quatorze heure ?"

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Par défaut
    Citation Envoyé par souviron34 Voir le message


    c'est à dire ?

    Si c'est la phrase, elle est correcte : c'est le raisonnement suivi non dans mon programme, mais dans la réflexion initiale ..

    Sous-entendu : "pourquoi aller chercher midi à quatorze heure ?"
    bonjour,

    Nic.sitbon, désolé mais c'est normal qu'il ne compile pas j'ai mis une version abrégée sans include et il n'y a même pas toutes les déclarations possibles. La raison pour laquelle je n'ai pas mis tout le code est que vous n'auriez pas su le tester, car mon pc communique avec des µp et attends la réception de sockets venant de ces µp.

    Souviron je ne comprends pas ce que tu dis... A quoi sert le sleep(99999) ? désolé mais je ne vois pas du tout

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par bombledq Voir le message
    Nic.sitbon, désolé mais c'est normal qu'il ne compile pas j'ai mis une version abrégée sans include et il n'y a même pas toutes les déclarations possibles. La raison pour laquelle je n'ai pas mis tout le code est que vous n'auriez pas su le tester, car mon pc communique avec des µp et attends la réception de sockets venant de ces µp.
    Une des règles du forum est de poster un code minimal qui compile.

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

Discussions similaires

  1. Panne de disque dur causé par mauvais config du jumpers
    Par zabari_saad dans le forum Composants
    Réponses: 2
    Dernier message: 17/11/2007, 23h47
  2. ralentissement windows causé par la carte graphique
    Par dark vador dans le forum Composants
    Réponses: 9
    Dernier message: 07/11/2007, 09h13
  3. Réponses: 13
    Dernier message: 24/04/2007, 10h50
  4. Probleme causé par Windows PE 2.0
    Par Shady dans le forum Windows Vista
    Réponses: 3
    Dernier message: 16/07/2006, 03h52
  5. [debutant][servlet]erreur causée par une listBox
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/03/2004, 10h53

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