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 :

Probleme descripteur de fichier


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut Probleme descripteur de fichier
    Bonsoir,

    J'ai un petit probleme dans un programme que je fais sous linux, j'utilise des variables allouer dynamiquement, auquel j'attribue des valeurs lus dans des fichiers. Le problème viendrais des descripteurs de fichiers

    je déclare mes variables comme ceci, dans une fonction appeller plusieurs fois:

    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
     
    int startDeamon()
    {
    char *IP=NULL, *date_search=NULL, *date_lastModif=NULL, *date_lastScan=NULL, *SRCip={"SRC"}, *buff_file=NULL;
      FILE *file_ulog=NULL, *file_out=NULL;
     
     ...
     
    file_ulog=fopen(FILE_ULOG,"r");
      	if (file_ulog == NULL ) exit(1);
     
      date_search=scalloc(24);
     
      date_lastScan=scalloc(24);
     
      date_lastModif=scalloc(24);
     
       if ( stat(FILE_ULOG, &mystat) == -1) { perror("stat"); exit(EXIT_FAILURE);} 
      strftime(date_lastModif, 25, "%c", localtime(&mystat.st_mtime));
     
      if ( ( file_out=fopen(FILE_OUT,"r") ) == NULL )
      {
    ...
    Plus loin a la fin de la fonction je dois fermer les descripteur et libérer la mémoire allouer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    free(date_search);
    free(date_lastModif);
    free(date_lastScan);
     
    date_search=NULL;
    date_lastModif=NULL;
    date_lastScan=NULL;
     
    if(file_ulog != NULL)
        fclose(file_ulog);
     
    if(file_out != NULL)
       fclose(file_out);
    Et la ca plante au niveau du fclose(file_out) si j'ai écris dans file_out, j'ai droit à ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *** glibc detected *** free(): invalid next size (normal): 0x0804de68 ***
    Avez vous une idée?

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Mouais, moi je demande plus de code et aussi l'erreur que le free te donne.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dépassement dans l'un de tes trois buffers alloués.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà que tu alloues 24 pour chaque tableau et tu passes 25 à strftime...

    Jc

  5. #5
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    Ben j'en ai vraiment pas l'impression, pour moi ca vient d'un fclose. Car ca plante juste dessus. Voila ma fonction entiere (j'ai mis des printf un peu partout pour tracer):

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    int startDeamon()
    {
     
      struct stat mystat;
      char *IP=NULL, *date_search=NULL, *date_lastModif=NULL, *date_lastScan=NULL, *SRCip={"SRC"}, *buff_file=NULL;
      FILE *file_ulog=NULL, *file_out=NULL, *file_tmp=NULL;
      int nbSec, cpt=0;
      time_t t;
     
      //récupère l'heure courante
      t=time(NULL);  
     
      file_ulog=fopen(FILE_ULOG,"r");
      	if (file_ulog == NULL ) exit(1);
     
      date_search=scalloc(24);
     
      date_lastScan=scalloc(24);
     
      date_lastModif=scalloc(24);
     
      //On recupère la date de la derniere modification du fichier de log d'ulog 
      if ( stat(FILE_ULOG, &mystat) == -1) { perror("stat"); exit(EXIT_FAILURE);} 
      strftime(date_lastModif, 25, "%c", localtime(&mystat.st_mtime));
     
      //on test si le fichier existe  
      if ( ( file_tmp=fopen(FILE_OUT,"r") ) == NULL )
      {
     
        syslog(LOG_INFO, "Le fichier survUlog.out n'existe pas, creation..." );
     
        //On créé le fichier puis on ecrit la date du dernier accès
        umask(UMASK_FILE_OUT);
     
        file_out=fopen(FILE_OUT,"w+");
        if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
        if(file_out != NULL)
          fclose(file_out);
     
        //On copie la date dans la seconde variable
        strcpy(date_lastScan, date_lastModif);
     
      }
      else
      {
        //Le fichier existe on lit la date 
        file_out=fopen(FILE_OUT,"r");
     
        fread(date_lastScan, 24, 1, file_out);
     
        if(file_out != NULL)
          fclose(file_out); 
     
      } 
     
      fclose(file_tmp);
     
      printf("date_lastScan %s, date_lastModif %s\n" ,date_lastScan, date_lastModif);
     
      // Exécution de la fonction "compareDate"
      nbSec=compareDate(date_lastScan, date_lastModif);
     
      //printf("Nombre de minutes écoulées depuis le dernier scan: %d min\n", nbSec/60);
     
      //Si le nombre de secondes est supérieur 0 un scan a été effectué. 
     
      if ( nbSec > 0 )
      { 
        syslog(LOG_INFO, "Lancement le: %s",  ctime(&t) ); 
     
        strcpy(date_search, substr(date_lastScan, 4, 18)); 
     
        //TODO:1, 3
     
        //On charge le fichier en mémoire
        buff_file=LoadFileToMemory(file_ulog);
     
        //On recherche la date dans d'ulog le fichier et on retourne sa position dans le fichier
        buff_file = Ulog_Search(buff_file, date_search);
     
        if( buff_file == NULL)
        { 
          syslog(LOG_INFO, "Date introuvable" );
        }
     
        buff_file = Ulog_Search_END_LINE(buff_file);
     
        while( buff_file != NULL )
        {
           date_search=Ulog_get_date(buff_file);
     
           printf("ici\n");
           IP=getip(buff_file);
      	printf("ici2\n");
     
           if( IP == NULL)
           { 
    	 syslog(LOG_INFO, "IP introuvable" );
           }
           else
           {
             printf("IP %s\n", IP);        
    	 //syslog(LOG_INFO, "Date du scan: %s, IP en cause: %s", date_search, IP );
    	 printf("print\n");
           }
     
           cpt++;
     
           buff_file=Ulog_Search_END_LINE(buff_file);
     
        }
     
        //fclose(file_out);
     
        printf("write\n");
        //TODO 5
     
        //On écrit la date du dernier scan dans le fichier
     
       file_out=fopen(FILE_OUT,"w+");
        	if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
        printf("close\n");
        printf("file_out: %d\n", file_out);
     
        if(file_out != NULL)
          fclose(file_out);
     
        printf("closed\n");
      }
     
      printf("free\n");
      free(date_search);
      free(date_lastModif);
      free(date_lastScan);
     
      date_search=NULL;
      date_lastModif=NULL;
      date_lastScan=NULL;
     
      if(file_ulog != NULL)
        fclose(file_ulog);
      printf("bye\n");  
      return 0;
    }
    Le problème vient ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    file_out=fopen(FILE_OUT,"w+");
        	if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
        printf("close\n");
    Pour écrire dans le fichier file_out, je dois modifier un fichier. Si cela arrive voila la sortie du programme quand il crash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    date_lastScan Sun May 13 23:04:50 2007, date_lastModif Tue May 15 20:36:46 2007
    ici
    ici2
    IP 192.168.1.12
    print
    ici
    ici2
    IP 192.168.1.12
    print
    write
    close
    file_out: 134536184
    *** glibc detected *** free(): invalid next size (normal): 0x0804dbf8 ***
    [quote]
    Déjà que tu alloues 24 pour chaque tableau et tu passes 25 à strftime...
    [quote]
    Si je met 24 a strftime, la variable est vide.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Blo0d4x3
    Si je met 24 a strftime, la variable est vide.
    Alors utilise un tableau de 25, voyons!

    De plus, un pointeur s'affiche avec %p, pas %d...

    PS: Qu'est-ce que la fonction scalloc() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    Cette fonction alloue la mémoire dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *scalloc(int stringsize)
    {
     
      char *buffer;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
        fprintf ( stderr, "\rERREUR D'ALLOCATION !!");
     
      return buffer;
    }

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Blo0d4x3
    Cette fonction alloue la mémoire dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *scalloc(int stringsize)
    {
     
      char *buffer;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
        fprintf ( stderr, "\rERREUR D'ALLOCATION !!");
     
      return buffer;
    }
    Ouais donc si calloc echoue tu retournes quand même buffer cad NULL, et pas de test du retour de smalloc.

  9. #9
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    ouai a par un message d'erreur, et le programme plante.
    Je corrigerai ca quand j'aurai trouver la vrai raison du plantage glibc.

  10. #10
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    si ca peut aider à m'aider :-), quand je le lance avec gdb:

    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
     
    gdb ./survUlogd
    GNU gdb 6.4.90-debian
     
    (gdb) run
    Starting program: /home/futex/Documents/Sources/C/survUlog/survUlogd
    Failed to read a valid object file image from memory.
     
    Program exited normally.
    Second close
    date_lastScan Tue May 15 21:39:56 2007, date_lastModif Tue May 15 21:39:56 2007
    free
     
    (gdb) Second close
    date_lastScan Tue May 15 21:39:56 2007, date_lastModif Tue May 15 21:59:20 2007
    ici
    ici2
    IP 192.168.1.12
    print
    ici
    ici2
    IP 192.168.1.12
    print
    write: 24
    close
    file_out: 0x804f170
    *** glibc detected *** free(): invalid next size (normal): 0x0804f170 ***

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Bon plusieurs points faibles pouvant provoquer des crashs...

    Ensuite je n'ai pas regardé le reste...

    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
    int startDeamon()
    {
    ....
    
      //on test si le fichier existe  
      if ( ( file_tmp=fopen(FILE_OUT,"r") ) == NULL )
      {
       
        syslog(LOG_INFO, "Le fichier survUlog.out n'existe pas, creation..." );
    
        //On créé le fichier puis on ecrit la date du dernier accès
        umask(UMASK_FILE_OUT);
    
        file_out=fopen(FILE_OUT,"w+");
        /* A tester AVANT le fwrite */
        if(file_out != NULL) 
          {     
              if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
        
             fclose(file_out);
         }
    
        //On copie la date dans la seconde variable
        strcpy(date_lastScan, date_lastModif);
     
      }
      else
      {
    /* Le fichier EST DEJA OUVERT */   
        //Le fichier existe on lit la date 
    /*    file_out=fopen(FILE_OUT,"r");*/ 
           file_out = file_tmp ;   
     
        fread(date_lastScan, 24, 1, file_out);
    
        /* ON EST DEJA DANS LA BONNE CONDITION */
      /*    if(file_out != NULL) */
          fclose(file_out); 
    
      } 
    
    /* LE FICHIER EST SOIT DEJA FERME SOIT N'EXISTE PAS */   
    /*  fclose(file_tmp);*/ 
    
    
    ............
    
        //On écrit la date du dernier scan dans le fichier
     
       file_out=fopen(FILE_OUT,"w+");
    /* MANQUE LE TEST */
       if ( file_out != NULL )
         {
        	if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
        printf("close\n");
        printf("file_out: %d\n", file_out);
    
    /* ON EST DEJA DANS LA BONNE CONDITION */
    /*    if(file_out != NULL) */
    
          fclose(file_out);
         printf("closed\n");
         }
      }
    ....
    
    return 0;
    }

  12. #12
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    Par défaut
    Je crois avoir identifier le probleme mais pas encore résolu. Ca viendrais de la fonction devant charger le fichier en mémoire qui prend en paramètre le descripteur de fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    buff_file=LoadFileToMemory(file_ulog);
    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
     
    char *LoadFileToMemory(FILE *fileDesc)
    {
      char *buff=NULL;
      int j=0, c;
     
      buff=scalloc(8092);
     
      //On charge le fichier en mémoire
     
      while(( c=fgetc(fileDesc)) != EOF)
      {
        fseek(fileDesc, -1, SEEK_CUR);
        fscanf(fileDesc,"%c", &buff[j]);
        j++;
      }
     
      return buff;
    }

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Bah oui pas de test de dépassement du buffer (et en plus double lecture du fichier)...

    Pourquoi faire compliqué quand on peut faire simple ???

    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
    char *LoadFileToMemory(FILE *fileDesc)
    {
      char *buff=NULL;
      int c, j = 0;
    
      buff=scalloc(8092);
      if ( buff == NULL )
         return buff ;  
    
      //On charge le fichier en mémoire
    
      while( ((c=fgetc(fileDesc)) != EOF) && (j < 8092) )
      {
         buff[j] = c ;
        j++ ;
      }
     
      return buff;
    }

Discussions similaires

  1. Ecran bleu...au demarrage...probleme systeme de fichier ?
    Par ludophil dans le forum Windows XP
    Réponses: 5
    Dernier message: 10/04/2007, 02h44
  2. TSearchRec probleme taille du fichier
    Par beastman007 dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2005, 16h56
  3. [VB.NET] Probleme avec les fichiers!!
    Par ludovic85 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2005, 17h12
  4. [langage] [Fichier]problème modification de fichier
    Par Melchisedec dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2004, 23h01
  5. Descripteur de fichier
    Par Zazeglu dans le forum C
    Réponses: 22
    Dernier message: 15/09/2003, 19h45

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