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

Linux Discussion :

Lecture de fichiers de plus de 4Go


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut [Résolu]Lecture de fichiers de plus de 4Go
    Bonjour à tous,

    Dans le cadre de mon cours de Système d'exploitation, je dois réaliser une programme capable d'afficher les partitions présentes sur le disque principal.

    Pour ce faire, je vais lire les quatre entrées des partitions principales (qui se trouvent juste après le MBR). Je dois ensuite, si je détecte une partition étendue (ce qui est le cas ), aller analyser les entrées des partitions logiques.

    D'un point de vue technique, j'ouvre le "fichier" /dev/sda en lecture et le traite comme si c'était un bête fichier sur le disque. Jusque là pas de problème, j'arrive à afficher correctement les quatre entrées des partitions principales mais le problème arrive juste après. J'ai la partition étendue qui commence au 10 000 000ème secteurs, ce qui m'amène au 5 120 000 000ème octets. Ce nombre énorme ne rentre pas dans un simple "unsigned int/unsigned long", qui est utilisé pour dans la fonction "lseek()" pour me déplacer dans mon fichier. Le véritable paramètre de "lseek()" est un "off_t" qui, si je regarde le code de "stdio.h" est un "long" ou un "long long" selon la taille de l'entrée prévue dans la table des descripteurs de fichiers ouverts :

    104 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
    105 typedef long off_t; <typedef:off_t>
    106 #else
    107 typedef __longlong_t off_t;

    De ce côté là, un "long long" m'aurait grandement plu mais apparemment sur le système 32 bits que j'utilise au laboratoire, ce n'est pas ce cas là.

    J'ai bien trouvé l'appel système "llseek" (man) mais les résultats sont erratiques. Vous allez me dire que c'est normal avec une entrée de 32bits dans la table des fichiers ouverts mais quand même

    Je procède au téléchargement d'une distribution 64bits en espérant que cela fonctionnement (logiquement) mais je ne comprends pas comment fdisk, tournant sur le système 32bits, arrive lui à lire plus loin que 4Go...il doit y avoir une manière de le faire et j'espère que quelqu'un de ce forum connaisse la réponse J'ai pourtant essayé de regarder le code source de fdisk mais je m'y perds très vite.

    Merci de votre aide !

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Par défaut
    le type "long long" existe bien sur une plateforme 32 bits Linux/gcc. tu n'as pas besoin d'une architecture 64 bits. Ce type est défini à partir de la norme ANSI C99.
    Seulement tu t'imagine que la variable ne sera pas 'lue' en un cycle de processeur.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    Mais comment cela est traité au niveau de la position dans la table des descripteurs de fichiers ouverts qui dans ma mémoire est codé sur 4 octets ?

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Par défaut
    Il faut faire le bon appel ;
    lseek64
    Prototype :

    off64_t lseek64(int fd, off64_t offset, int whence);

    La routine de bibliothèque lseek64() utilise un type sur 64 bits même si off_t est un type 32 bits. Son prototype (et le type off64_t) n’est disponible que lorsqu’on
    compile avec

    #define _LARGEFILE64_SOURCE

    La fonction lseek64() est disponible depuis la glibc 2.1, et elle est définie comme un alias de llseek().
    Bonne chance.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    Ca à l'air de fonctionner Un énorme merci pour cette aide très précieuse !

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par bizulk Voir le message
    Il faut faire le bon appel ;


    Bonne chance.
    C'est typiquement ce qu'il ne faut pas faire, logiquement, il n'y a pas besoin de toucher au code, il suffit de passer à la compilation, les flags renvoyés par la commande
    .
    et c'est tout, l'ajustement de type et de fonction se fait automatiquement.

  7. #7
    Membre éclairé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Par défaut
    Mr Sitbon,
    Comme tu l'as remarqué il s'agit d'une citation des man pages, je n'ai encouragé aucune méthode d'implémentation mais simplément indiqué qu'il y a avait une fonction prenant en paramètre un entier 64 bits.

    Il n'y a pas vraiment de "logique" pour gérer la compilation d'un projet, mais plutôt une cohérence à avoir.
    Tu peux très bien écrire un fichier d'entêtes avec des symboles pour influencer la compilation, ça a au moins le mérite d'expliciter leur utilisation.

    Je ne connaissais pas bien getconf et cela paraît une méthode intéressante, mais je ne suis pas pour l'utilisation de commandes renvoyant la configuration de la machine hôte dans un makefile, surtout si l'on souhaite faire de la compilation croisée.

Discussions similaires

  1. Lecture du fichier le plus récent d'un sous-dossier en Java
    Par FayssalJava dans le forum Général Java
    Réponses: 3
    Dernier message: 17/03/2014, 14h20
  2. lecture de fichier de plus de 3000 lignes
    Par muslem dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 08/06/2007, 12h22
  3. Lecture performante de fichiers de plus de 4 Go.
    Par Kid Paddle dans le forum C++
    Réponses: 3
    Dernier message: 26/01/2007, 15h19
  4. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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