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 segmentation: close()


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut Problème segmentation: close()
    Bonjour,
    Je travaille actuellement sur une ouverture de liaison série sous qt, j'ouvre avec un "open", et je voudrais donc fermer avec un "close". Mais voilà, le compilateur me dit: segmentation fault.
    Voici le morceau de code concerné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void dialMeteo::initLiaison()
    {
     int ret;
     if ( fd > 0) close(fd);  // si déjà ouverte
     ret = dialMeteo :: ouvrir liaison();
    }
    fd est déclaré dans le .h en public, l'include du .h est fait. Je ne vois pas trop ou peut ete le problème, donc si qqun peut m'aider.
    Merci, Alga

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour.
    IL manque des expliquations...
    Qu'es ce que fd???
    Comment est il initialisé???

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Oui désolé....
    Fd est le descripteur de fichier qui est retourné par la fonction open

    J'utilise la ligne suivante dans une autre fonction du programme:

    fd = open ("/dev/ttyS0", O_RDWR | O_NONBLOCK);

    En debug, il est bien égal à 0 avant que j'ai ouvert la liaison, puis passe à une valeur positive. On rentre donc dans le if, mais il y a cette erreur.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Sans plus de code.
    Je ne vois pas comment l'on peut t'aider.
    Puis cela ne semble pas etre un problème Qt.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Ok ben merci quand meme. Mais pour mettre tout le code, se serait trop long. Et puis à mon avis ce c'est pas non plus un probleme qt, je pense que cela vient soit du kdevelop, soit du code en c.
    Je verrais bien

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Pour commencer, verifie qu tu initialise bien fd.
    Ca, ça ne compile sûrement pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret = dialMeteo :: ouvrir liaison();
    Si tu veut je peu déplacer ton poste, mais il faudrait que tu dise quel lib tu utilise et être un peu plus précis.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Oui je veux bien que tu déplaces le poste, j'utilise la suse 10.2 de linux, et la librairie Qt 3.
    Pour ce qui est de la compilation, tout compile, mais après je ne dis pas que c'est juste. Le seul problème de compilation que j'ai est ce "erreur de segmentation".
    L'article serait déplacé ou? Je ne connais pas encore bien le site, ni le fonctionnement en détails.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Alga007 Voir le message
    Oui je veux bien que tu déplaces le poste, j'utilise la suse 10.2 de linux, et la librairie Qt 3.
    Pour ce qui est de la compilation, tout compile, mais après je ne dis pas que c'est juste. Le seul problème de compilation que j'ai est ce "erreur de segmentation".
    L'article serait déplacé ou? Je ne connais pas encore bien le site, ni le fonctionnement en détails.
    Ben déja dit quel lib tu utilise. Fd appartiens à quel lib?
    C'est un problème en C ou en C++?

  9. #9
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Ben déja dit quel lib tu utilise. Fd appartiens à quel lib?
    C'est un problème en C ou en C++?
    open/close et les file descriptor c'est du C système (Edit: appliqué à linux dans le cas présent bien sûr)

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    fd est un int que j'ai déclaré dans le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class dialMeteo
    {
     public: int fd;
    }
    Je l'initialise à 0 dans le constructeur de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dialMeteo::dialMeteo(...........)
    {
     fd = 0;
    }
    Et je l'utilise comme suit:

    Je ne vois pas comment détaillé plus, et concernant a librairie il n'appartient à aucune, je l'ai juste déclaré.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    C'est sûrement pas la cause du plantage mais la valeur 0 est valide pour un descripteur de fichier retourné par la fonction open.
    regarde le man de open().
    Initialise fd à -1 et modifie les tests en conséquence.

    Après le close(), il faudrait remettre fd=-1 pour éviter de refermer ultérieurement un descripteur devenu invalide.

    Voila, sans plus de code difficile de t'aider plus.

    Bon courage.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Ben en fait j'étais avant sur le forum C++, et on m'a déplacé ici car le problème ne semble pas venir du C++, mais du code en C, de l'utilisation du close. Je vais tenter de l'initialiser à -1, mais à mon avis ça ne reglera pas le pb, car ce n'est pas le test qui n'est pas bon, mais vraiment l'instruction.

  13. #13
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Cela sent une mauvaise gestion des cycles de vie de fd.
    Débugge ou rajoute une trace écran à chaque fois que tu manipules cette donnée -- en précisant bien valeur de fd, et focntion où tu es.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pas du C. Je déplace en C++ ?
    Il avait poste dans le forum Qt.

    Comme tu le sens mais comme le problème viens de open. Pour moi, c'est plustôt un problème C.

  15. #15
    Membre éprouvé Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Par défaut
    salut,

    mais le pb ne vient surement pas sur le morceau de code posté...aprés le close(fd), il faut vérifier que le handle n'est plus utilisé pour faire un read par exemple

    ++

  16. #16
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par cfdev Voir le message
    salut,

    mais le pb ne vient surement pas sur le morceau de code posté...aprés le close(fd), il faut vérifier que le handle n'est plus utilisé pour faire un read par exemple

    ++
    C'est une autre possibilité. Plus trivial, il semble que l'instance de dialMeteo n'existe pas (soit elle a été détruite avant, soit elle est nulle au moment de l'appel).

    Généralement, un seg-fault, ça se debug. On vérifie la call-stack, on reproduit le problème, on regarde qui appelle quoi et dans quel ordre, on met des points d'arrêt, etc.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Problème to close database
    Par Nebulis dans le forum Android
    Réponses: 2
    Dernier message: 09/01/2011, 17h06
  2. Problème event Closing en mode OOB
    Par CRNice dans le forum Silverlight
    Réponses: 4
    Dernier message: 15/07/2010, 14h48
  3. ORA-01552: Problème segment d'annulation
    Par tck-lt dans le forum Administration
    Réponses: 4
    Dernier message: 20/05/2010, 14h26
  4. A* et SDL (probléme dans closed)
    Par fastzombi dans le forum C++
    Réponses: 4
    Dernier message: 19/01/2007, 11h34
  5. Problème Segmentation Fault
    Par marcix dans le forum C
    Réponses: 4
    Dernier message: 04/12/2006, 14h48

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