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 :

Segfaultsur une fonction pour lire des commandes systemes


Sujet :

C

  1. #1
    Membre régulier Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 71
    Points
    71
    Par défaut Segfaultsur une fonction pour lire des commandes systemes
    Bonjour, je me suis fais deux fonctions qui m'aide a lire les fonctions systémes sur une machine linux :


    la premiére fonction donne la taille du résultat d'une commande et l'autre fonction enegistre dans un char, ce qu'il devrait s'afficher dans le résultat d'une ligne de commande

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include <stdio.h>
    #include <Eina.h>
    /**
     * \fn lecture_taille_chaine( char *cmd)
     * \brief Fonction qui donne le nombre de charactére du résultat d'une CMD linux
     *
     * \param *cmd Chaîne comportant la ligne de commande linux
     * \return int le nombre de charactére dans le résultat de la CMD linux
     */
    int lecture_taille_chaine( char *cmd)
    {
    	size_t l = 0;
    	FILE * pp;
    	char buf[256];
    		 char *dst;
    		 int t=0;
     
    	  if ((pp = popen(cmd, "r")) == NULL)
        {
            perror("popen");
            exit(EXIT_FAILURE);
        }
     
    	while (fgets(buf, sizeof buf, pp)) 
    	{ 
    	l = strlen(dst) + strlen(buf) + 1;	
    		dst = calloc(l, sizeof(char*));
    		t = t + l;
    	}   
         pclose(pp);      
     
     return t;
    }
     
    /**
     * \fn lire_data_CMD_Linux( char *cmd,int taille)
     * \brief Fonction de lecture de ligne de commande linux
     *
     * \param *cmd Chaîne comportant la ligne de commande linux
     *        taille je sais pas
     * \return une chaine de carractére avec le résultat de ligne de commande linux.
     */
    char * lire_data_CMD_Linux( char *cmd)
    { 
    	size_t l;
    	FILE * pp;
    	char buf[256];
    	char *dst;
     
    	int taille = lecture_taille_chaine(cmd);
     
    	  if ((pp = popen(cmd, "r")) == NULL)
        {
            perror("popen");
            exit(EXIT_FAILURE);
        }
     
    	l = taille + 1;
    	//dst = malloc(l);
    	dst = calloc(l, sizeof(char*));
     
    	while (fgets(buf, sizeof buf, pp)) 
    	{ 
    		eina_strlcat(dst, buf, taille); 
    	}   
         pclose(pp); 
     
     
     return dst;
     }    
     
     
     
     
         int main()
    {	
     
    	printf("df = %s\n",lire_data_CMD_Linux("df"));
    	printf("ls = %s\n",lire_data_CMD_Linux("ls"));
     
     
     
      	return 0;
     
    }
    Le code donne une erreur de segmentation, j'ai essaie gdb, mais j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [Thread debugging using libthread_db enabled]
     
    Program received signal SIGSEGV, Segmentation fault.
    0x001ce7a0 in ?? () from /lib/tls/i686/cmov/libc.so.6
    (gdb)
    et la je ne sais pas quoi faire pour trouver ce qui cloche dans le programme.



    merci d'avance

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Dans la fonction lecture_taille_chaine(), lors de la première itération tu appelles strlen() sur dst qui n'est pas initialisé et qui pointe donc n'importe où.
    Lors des itérations suivantes, dst pointe sur une chaîne vide et donc strlen(dst) vaut 0.
    De plus l'utilisation de dst n'est pas nécessaire, il suffit d'incrémenter t de la taille lue.
    En outre, il n'est pas nécessaire d'ajouter 1 à la taille à chaque itération, il suffit de le rajouter un fois à la fin.

  3. #3
    Membre régulier Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 71
    Points
    71
    Par défaut
    9a marche nikel :

    voila les fonctions avec tes recommendation ;

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <stdio.h>
    #include <Eina.h>
     
    /**
     * \fn lecture_taille_chaine( char *cmd)
     * \brief Fonction qui donne le nombre de charactére du résultat d'une CMD linux
     *
     * \param *cmd Chaîne comportant la ligne de commande linux
     * \return int le nombre de charactére dans le résultat de la CMD linux
     */
    int lecture_taille_chaine( char *cmd)
    {
    	size_t l = 0;
    	FILE * pp;
    	char buf[256] ="";
     
    		 int t=0;
     
    	  if ((pp = popen(cmd, "r")) == NULL)
        {
            perror("popen");
            exit(EXIT_FAILURE);
        }
     
    	while (fgets(buf, sizeof buf, pp)) 
    	{ 
    	l =  strlen(buf);	
     
    		t = t + l;
    	}   
         pclose(pp);      
     
     return t;
    }
     
    /**
     * \fn lire_data_CMD_Linux( char *cmd,int taille)
     * \brief Fonction de lecture de ligne de commande linux
     *
     * \param *cmd Chaîne comportant la ligne de commande linux
     *        taille je sais pas
     * \return une chaine de carractére avec le résultat de ligne de commande linux.
     */
    char * lire_data_CMD_Linux( char *cmd)
    { 
    	size_t l;
    	FILE * pp;
    	char buf[256] ="";
     char *dst="";
     
    	int taille = lecture_taille_chaine(cmd);
     
    	  if ((pp = popen(cmd, "r")) == NULL)
        {
            perror("popen");
            exit(EXIT_FAILURE);
        }
     
    	l = taille + 1;
    	//dst = malloc(l);
    	dst = calloc(l, sizeof(char*));
     
    	while (fgets(buf, sizeof buf, pp)) 
    	{ 
    		eina_strlcat(dst, buf, taille); 
    	}   
         pclose(pp);
     
     return dst;
    }
    merci beaucoup

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

Discussions similaires

  1. Fonction pour lire des fichiers dans une archive MPQ
    Par MegaBigBoss dans le forum Débuter
    Réponses: 0
    Dernier message: 28/01/2012, 22h02
  2. Créer une fonction pour remplacer des caractères
    Par virtuadrack dans le forum C++
    Réponses: 4
    Dernier message: 11/09/2008, 14h52
  3. sizeof dans une fonction pour lire une chaine
    Par Haze. dans le forum Débuter
    Réponses: 11
    Dernier message: 06/11/2007, 12h07
  4. Réponses: 8
    Dernier message: 11/04/2007, 23h06
  5. Réponses: 1
    Dernier message: 10/09/2006, 16h09

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