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 :

Fermeture de fichier après utilisation zip.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut Fermeture de fichier après utilisation zip.
    Bonjour

    J'aurais aimé faire mieux (voir http://www.developpez.net/forums/d11...copie-fichier/ ), mais encore faudrait-il que ce que je fais déjà marche correctement !

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        fichier=enregistre_tmp_xml(ooo);
        tmp1=chemin_exe();
        sprintf(affichage,"%s%cLibO%cfeuille.zip",tmp1,SEPARATEUR,SEPARATEUR);
        sprintf(aff,"%s%c%s.odt",((char **)param)[CHEMIN],SEPARATEUR,((char **)param)[NOM]);
        copie_fichier(aff,affichage);
        f_zip=zip_open(aff,ZIP_CREATE,NULL); /* lignes (1) */
        n_zip=zip_source_filep(f_zip,fichier,0,0); /* récupération du fichier sous forme FILE * sans avoir à le copier sur le disque */ /* lignes (1) */
        zip_replace(f_zip,zip_name_locate(f_zip,"content.xml",ZIP_FL_NOCASE) ,n_zip); /* on l'injecte dans l'archive en lui donnant un nom */ /* lignes (1) */
        zip_close(f_zip);   /* on ferme l'archive */ /* lignes (1) */
        free(tmp1);
        fclose(fichier);
    La première ligne récupère un file * ouvert avec "FILE * sortie=tmpfile();"
    Lors de la fermeture de ce fichier (dernière ligne), j'ai un plantage du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *** glibc detected *** ./perso: double free or corruption (!prev): 0x0000000001024100 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x78a96)[0x7f826a132a96]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f826a136d7c]
    /lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7f826a122715]
    Ce que je ne comprends pas, c'est que si je commente les 4 lignes marquées en fin avec /* lignes (1) */, je n'ai plus ce plantage

    Le problème est encore simplifiable en remplaçant la première ligne par "fichier=tmpfile(); //enregistre_tmp_xml(ooo);", ça plante encore !

    Le plantage a bien lieu lors du "fclose(fichier)" et tout ce qui a été fait avant a bien été fait (fichier de sortie vérifié).

    J'avoue ne pas comprendre la raison de ce plantage testé sous ubuntu 11.10 et mageia 2.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Je n'ai jamais utilisé la libzip, cependant, d'après le source ici :
    https://bitbucket.org/glorpen/curse/...source_filep.c

    libzip peut fermer le fichier, si tu as appelé zip_source_filep (en tt cas, c'est comme ça que j'en comprends le source). Le manuel semble ne rien dire à ce sujet.

    Du coup, faire un fclose dessus revient à demander à la librairie standard de fermer un fichier déjà fermé, si je ne m'abuse.

    est-ce que ce que je dis parait avoir un sens ou bien j'ai rien compris ?

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je ne vois pas où mon fichier est fermé dans ce code source ! Je pense bien à quelque chose comme ça, mais je ne vois pas pourquoi la fonction ferrait ça et je trouve même que ce serait anormal !

    Il y a bien la ligne 238, mais comment je sais si ça passe par là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        case ZIP_SOURCE_FREE:
            free(z->fname);
            if (z->closep && z->f)
                fclose(z->f);
            free(z);
            return 0;
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    La logique derrière ça je la connais pas, mais il stocke bien ton pointeur de fichier passé par zip_source_filep, et sous certaines conditions (que je ne maitrise pas), il le ferme.
    Tu dois pouvoir prouver ou infirmer ma théorie si tu trouves une façon de voir combien de fichiers sont ouverts par ton processus à un instant T.
    Ou en utilisant je ne sais plus quel outil génial qui te permet de tracer les appels systèmes.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Hello,

    Tu utilises un grand nombre de fonctions dont on ne dispose pas du code source. C'est donc difficile de t'aider en l'état mais, à vue de nez, tu commences par allouer « tmpl » avec la fonction chemin_exe() sans vérifier si l'appel a réussi ou pas. Tu considères que la valeur de retour est forcément valide. Rien que ça, ça suffit à rendre ton programme incorrect sauf si tu peux garantir que chemin_exe() est dotée de dispositifs permettant de rattrapper les éventuelles erreurs ou mettre fin au programme (sauvagement, mais bon).

    Malgré cela, si le programme cesse de planter lorsque tu enlèves les lignes que tu as marquées, c'est qu'il est probable que les fonctions qui y sont appelées fassent un dépassement de tableau et aillent corrompre la pile. Les valeurs dans tes variables ne sont alors plus du tout valides.

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Les fonctions que j'utilise au début marchent bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        fichier=enregistre_tmp_xml(ooo);
        tmp1=chemin_exe();
        [...]
        copie_fichier(aff,affichage);
    La suite me le montre sans problème.
    Il est vrai qu'elles sont sensées marcher correctement, sinon, le programme plante. Dans le cas présent, je sais que ces fonctions marchent sans problème.

    Le problème de la corruption de mes variables après l'appel de la fonction n'est pas viable, car le programme plante pendant l'appel de la fonction fclose(fichier); , pas après. Tu me conseillerais de mettre plus tôt (3 lignes) afin de mieux tester ?

    Pour être encore plus radical, j'ai deux fois à peu près le même mode opératoire dans deux parties du programme, et les deux fois, j'ai le même problème que j'ai résolu de la même façon.

    Sinon, si tu veux mon code source, il est disponible sur http://troumad.org/Mes_regles/perso3.zip (17000 lignes).
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/08/2009, 16h04
  2. Réponses: 2
    Dernier message: 29/12/2008, 14h50
  3. Utilisation d'un fichier après création!
    Par NejNej dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/09/2008, 08h46
  4. [Zip] Droits sur fichiers après extraction avec PclZip
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/04/2008, 16h37
  5. [DOM] probleme de fermeture de fichier xml apres modification
    Par bibi73 dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 08/04/2008, 16h13

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