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 :

Erreur de segmentation en exécution linux


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 40
    Points
    40
    Par défaut Erreur de segmentation en exécution linux
    Voici une partie de mon code, celle qui produit l'erreur puisque lorsque je la met en commentaire il n'y a plus d'erreur. Je suis sur cette erreur depuis hier, et rien n'avance.
    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
    int a = 1;  //initiateur de boucle
     
        while(a==1)
        {
            FILE * logindex;
            logindex = fopen("./logindex3.log", "r+");
            if(!logindex)
            {
                char * files_rep = "./logwork/3";
                char * index_name = "logindex3.log";
                logindex_builder(files_rep, index_name); // Création de l'index
     
     
            }
            else if (file_exists_non_empty(logindex)==1) //on vérifie que logindex contienne des lignes !
            {
                        char * pathlog;
                        fscanf(logindex,"%[^\n]", &pathlog);    //on copie le chemin vers le fichier log à traiter
                        FILE * log;
                        log = fopen(pathlog, "r+");
     
                        	/////////// Varibales de récupération des données du fichier log ////////////////
                            char * timestamp;
                            char * ip;
                            char * port;
                            char * eventtype;
                            char * id_box;
                            char * event;
     
                            if(fgetc(log)==EOF)
                            {
     
                                file_line_delete(pathlog, logindex); //Suppression du log de l'index
                                file_delete(pathlog);   // Suppression du fichier log
     
                            }// fin if
     
                            else
                            {
                                while(fgetc(log)!=EOF)
                                {
     
                                    fgetc(log); // ligne par ligne
     
                                    char * ligne;
                                    fscanf(log,"%[^\n]", &ligne);
     
                                    fscanf(log,"%[^;];%[^;];%[^;];%[^;];%[^;];%s", &timestamp, &ip, &port, &eventtype, &id_box, &event);
                                    printf(" %s\n %s\n %s\n %s\n %s\n %s\n", timestamp, ip, port, eventtype, id_box, event);
                                    char * date = system("date");
                                    ////////// Chaîne de connexion //////////////////////////
                                    conn = PQsetdbLogin(*pghost, *pgport, *pgoptions, *pgtty, *dbName, *login,pwd);
                                    /////////////////////////////////////////////////////////
                                    char query[256];
                                    sprintf(query, "INSERT INTO mf_boxes_datalogs(dtlog_added_date,bx_ip,evt_type,bx_id,bx_data) VALUES ( '%s','%s', '%s', '%s', '%s')", date, ip, eventtype, id_box, event);
                                    res = PQexec(conn, query);
     
                                    PQfinish(conn); // fermeture de la connection
     
                                    ///////// Effacement de la ligne dans le fichier log /////////////
                                    char *delete_line;
                                    sprintf(delete_line, "sed -i '/%s/d' /%s", ligne, *pathlog);
                                    system(delete_line);
     
                                }// fin while
     
                            }// fin else
                            fclose(log);
            }//fin else if
     
     
     
        }// fin boucle principale

  2. #2
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Que sont censés faire les lignes du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(log,"%[^\n]",...
    ?
    Ca ressemble à des expressions régulières... me trompe-je ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Bonjour, les lignes fscan... récupère des lignes formatées dans des fichiers logs, les découpents, stocks les expressions dans des variables, et ces variables permettent de faire des INSERT dans une base de donnée.

  4. #4
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Je viens de regarder ça et je m'aperçois de mon ignorance.
    Désolé pour le bruit...

  5. #5
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    quand tu écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        char * pathlog;
                        fscanf(logindex,"%[^\n]", &pathlog);    //on copie le chemin vers le fichier log à traiter
    tu copies une chaine de caractère vers un pointeur non initialisé, ça devrait pas être plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        char pathlog[2000]; // 2000 est un exemple
                        fscanf(logindex,"%[^\n]", &pathlog);    //on copie le chemin vers le fichier log à traiter

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Grulim Voir le message
    Je viens de regarder ça et je m'aperçois de mon ignorance.
    Désolé pour le bruit...
    Tu n'as que 2 normes de retard, ça c'est la version de 1997 de la norme POSIX, voici la version 2004 : http://www.opengroup.org/onlinepubs/...ons/scanf.html et voici la version 2008 : http://www.opengroup.org/onlinepubs/...ons/scanf.html.

    Ce pattern "%[^\n]" veut dire, récupère toute la ligne (y compris les espaces contrairement au "%s") en t'arretant au premier retour à la ligne que tu rencontres (celui ci n'étant pas ajouté dans le buffer de destination).

    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    ok, ok...

    d'après la doc
    If the 'm' assignment-allocation character is not specified, the application shall ensure that the corresponding argument is a pointer to the initial byte of an array of char, signed char, or unsigned char large enough to accept the sequence and a terminating null byte, which shall be added automatically.
    il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        char pathlog[2000]; // 2000 est un exemple
                        fscanf(logindex,"%[^\n]", pathlog);    //on copie le chemin vers le fichier log à traiter

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    J'ai remplacé toutes mes initialisation de string par des malloc et ca fonctionne, merci.

  9. #9
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par vaderetro33 Voir le message
    J'ai remplacé toutes mes initialisation de string par des malloc et ca fonctionne, merci.
    N'oublie pas les free qui vont avec

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/05/2010, 16h17
  2. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  3. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18
  4. [Tomcat][Eclipse] erreur http 404 à l'exécution de servlet
    Par mayjo dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 30/07/2004, 18h19

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