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 :

Problème à l'utilisation des fonctions sigsetjmp et siglongjmp.


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Problème à l'utilisation des fonctions sigsetjmp et siglongjmp.
    Bonsoir,

    J'ai de nouveau un probleme...

    Je doit coder un ensemble de fonctions de gestion des thread (pthread.h en bien plus simple).

    Ma fonction t_yield() doit mettre en pause le thread qui l’exécute.

    Pour ce faire j'utilise, dans t_yield() la fonction sigsetjump qui sauvegarde l'environnement d'execution. Puis une autre fonction qui recharge l'environnment par la fonction siglongjmp().

    Le probleme c'est qu'a la recharche de l'environnement, la fonction t_yield() reprend mais ne revient jamais à la fonction du thread en question => erreur de segmentation

    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
    int t_yield()
    {
     
    	int test;
     
    	if ( (test=sigsetjmp( environnement, 0 )) == 0 )
    		siglongjmp( env_ordonnanceur, 1 );
            printf("toto\n");
    	return 0;
    }
    void fonction1()
    {
     
    	printf("tata\n");
    	t_yield();
     
    	printf("hahahaha\n");
     
    }
    Dans le terminal, je vois :
    tata
    toto
    segmentation fault

    Quelqu'un aurait une explication ?
    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu es sûr que ton contexte "environnement" n'est pas modifié/altéré/corrompu entre le sigsetjmp( environnement, 0 ) et le siglongjmp( environnement, 0 ) ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    A priori pas de problème de ce coté là.
    La fonction siglongjmp( environnement, 0) me renvoie bien dans la fonction t_yield() (qui se termine normalement) mais à la fin de celle-ci je ne revient pas à ma fonction "fonction1" qui à appelé t_yield()

    La variable environnement est stockée dans une structure déclarée en globale, cette variable n'est pas réutilisée avant la fonction siglongjmp(...).

Discussions similaires

  1. problème d'utilisation des fonctions mean et stddev
    Par AlfredKr dans le forum Débuter
    Réponses: 7
    Dernier message: 29/03/2014, 15h34
  2. Réponses: 3
    Dernier message: 19/12/2009, 11h49
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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