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 :

segmentation fault avec variable globale


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut segmentation fault avec variable globale
    bonjour,
    suite a un projet a développé ou je dois utilisé la fonction signal pour envoyer et recevoir des information.
    Je me retrouve dans l'impasse suite a segfault.
    je tiens a préciser que mon niveaux en programmation n'est pas très élevée.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #include <signal.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
     
    char    *global;
     
    int     check_global()
    {
      int   i;
     
      i = 0;
      while (global[i] != 0)
        {
          if (global[i] == '0' && global[i + 1] == '0')
            return (-1);
          i = i + 1;
        }
      return (0);
    }
     
    void    handler(int signo)
    {
      static int    i;
     
      i = 0;
      global = malloc(sizeof(char));
      if (signo == SIGUSR1)
        {
          write(1, "o", 1);
          global[i] = '1';
        }
      else
        {
          write(1, "t", 1);
          global[i] = '0';
        }
      i = i + 1;
      global[i] = 0;
    }
     
    int     main()
    {
      while (1)
        {
          usleep(1);
          if (signal(SIGUSR1, handler) == SIG_ERR)
            {
              return (-1);
            }
          if (signal(SIGUSR2, handler) == SIG_ERR)
            {
              return (-1);
            }
          if (check_global() == -1)
            break;
        }
      my_putstr(global);
      return (0);
    }
    voici le récepteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <unistd.h>
     
    void    my_putstr(char *str)
    {
      int   i;
     
      i = 0;
      write(1, &str[i++], 1);
    }

    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
    #include <signal.h>
    #include <sys/types.h>
     
    int     main(int ac, char **av)
    {
      int   i;
      char  *str;
     
      str = "101100";
      i = 0;
      while (str[i] != 0)
        {
          if (str[i] == '1')
            kill(atoi(av[1]), SIGUSR1);
          usleep(10000);
          if (str[i] == '0')
            kill(atoi(av[1]), SIGUSR2);
          usleep(10000);
          i = i + 1;
        }
      return (0);
    }
    et l'éméteur

    et donc le résultat donne
    [1] 18940 segmentation fault (core dumped) ./USR1

    alors que je souhaiterez avoir le résultat "101100". dans "global"
    et ensuite l'afficher
    merci par avance de vos réponse.

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    le souci ne viendrait-il pas de ta fonction handler ?
    Au début tu alloues un seul char pour ton pointeur global mais à la fin tu écris dans global[1].

    En faisant du pas-à-pas t'as pas réussi à trouver l'entrée exacte qui fait planter ton code ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Un buffer global qui nécessite une allocation dynamique !!!
    Un Handler qui fait une allocation dynamique !!!!!!!
    Une allocation dynamique d'un octet qui doit recevoir la chaîne "101100" qui fait 7 octets !!!!!!!!!!!!!!!

  4. #4
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut merci
    merci de vos réponses.
    j'ai fait quelque test et c'est bien le malloc qui etait mal placé et que ne mallocé pas assez.

  5. #5
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Citation Envoyé par Mystogunn Voir le message
    merci de vos réponses.
    j'ai fait quelque test et c'est bien le malloc qui etait mal placé et que ne mallocé pas assez.
    On dit "qui ne mallocait pas assez" ... le niveau de français de jeunes de nos jours, ça fait peur.



    Bon dev.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu vas par là...

    "j'ai fais quelques tests et c'est bien le malloc qui était mal placé et que ne mallocait pas assez. "
    Ajoutons que ce n'est pas malloc qui ne demandait pas assez, mais l'appelant.

    Quant à toi, tu as aussi oublié un au "des jeunes"

    Je préfère ne point trop m'appitoyer sur cette malheureuse orthographe. D'autant que j'affectionne l'ancien vocabulaire, qui donne une délicate saveur à toute diatribe.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/02/2007, 19h39
  2. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12
  3. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  4. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  5. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20

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