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 :

Ouvrir et lire un fichier dans un module linux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Par défaut Ouvrir et lire un fichier dans un module linux
    Bonjour j'ai modifié un code c recement pour pouvoir ouvrir et lire le contenu d'un fichier j'ai ajoué une fonction
    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
     
    static int load_file_based_list( char* path, int id,char* lib) {
     
    #ifdef __KERNEL__
      FILE *fd = fopen(path, "r");
      int z;	 
      if(fd != NULL) {
     
        while(fd) {
          char buffer[512], *line;
          if(!(line = fgets(buffer, sizeof(buffer), fd)))
            break;
     
          if(((z = strlen(line)) <= 1) || (line[0] == '#'))
            continue;
          else
            line[z-1] = '\0';
     
    	.......
     
       }
     
        fclose(fd);
      }
      #endif
      return(0);
    }
    quand je compile (la commande make) je recois les erreurs suivante:
    erreur: âFILEâ undeclared (first use in this function)
    erreur: âfdâ undeclared (first use in this function)
    merci pour votre aide

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    j'ai peur que tu t'égares un peu, #ifdef __KERNEL__ sert en gros à délimiter du code kernel, donc ce serait cohérent avec ton titre qui parle de module linux, en revanche dans un module kernel on utilise pas les fonctions de la libc, hors FILE, fopen(), fgets(), strlen() et fclose() appartiennent à la libc

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Par défaut
    merci pour ta reponse....
    Y a til un moyen pour manipuler un fichier dans ce cas de figure?

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    oui, en utilisant des fonctions kernel.

    • les fonctions de la section 2 de man sont les appels systèmes, et donc des fonctions fournies par le noyau
    • globalement (...) les fonctions exportées par le noyau trouvent leur correspondance dans le noyau en rajoutant le préfixe sys_
    • c'est assez simple de troquer fopen/fgets/fclose par sys_open/sys_read/sys_close, au moins dans l'idée
    • c'est probablement une mauvaise idée de faire un read bloquant dans un module kernel, encore plus si le fichier doit être ouvert/fermé très fréquemment

    et même quand on sait tout ça il manque encore un certain nombre de connaissances pour pouvoir faire les choses proprement, mais si on ne sait pas ça c'est possiblement qu'on connait mal le C et Linux

    pour faire de la programmation noyau, il faut au minimum connaitre assez bien le C et Linux

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Par défaut
    Merci BufferBob,
    Le fichier sera chargé uniquement lors du chargement du module.
    Aussi je n'ai effectivement pas de connaissance avancé en C.
    mais je dois faire cette modification. merci pour ton support.
    cordialement.

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par toure32 Voir le message
    mais je dois faire cette modification.
    le thread suivant devrait t'intéresser, le gars conseille d'utiliser directement les fonctions du VFS (donc je me trompais même en évoquant sys_open et sys_close tu vois)
    et de préciser : "You should be aware that you should avoid file I/O when possible.", on vous aura prévenu

    pour la pérennité, open :
    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
    struct file* file_open(const char* path, int flags, int rights) {
        struct file* filp = NULL;
        mm_segment_t oldfs;
        int err = 0;
     
        oldfs = get_fs();
        set_fs(get_ds());
        filp = filp_open(path, flags, rights);
        set_fs(oldfs);
        if(IS_ERR(filp)) {
            err = PTR_ERR(filp);
            return NULL;
        }
        return filp;
    }
    close :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void file_close(struct file* file) {
        filp_close(file, NULL);
    }
    read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int file_read(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
        mm_segment_t oldfs;
        int ret;
     
        oldfs = get_fs();
        set_fs(get_ds());
     
        ret = vfs_read(file, data, size, &offset);
     
        set_fs(oldfs);
        return ret;
    }
    write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int file_write(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
        mm_segment_t oldfs;
        int ret;
     
        oldfs = get_fs();
        set_fs(get_ds());
     
        ret = vfs_write(file, data, size, &offset);
     
        set_fs(oldfs);
        return ret;
    }
    sync :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int file_sync(struct file* file) {
        vfs_fsync(file, 0);
        return 0;
    }
    edit: le lien suivant est aussi très intéressant http://kernelnewbies.org/FAQ/WhyWrit...romKernelIsBad

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

Discussions similaires

  1. Ouvrir et lire un fichier .csv
    Par Art19 dans le forum Composants VCL
    Réponses: 24
    Dernier message: 23/05/2025, 11h13
  2. ouvrir et lire un fichier sur serveur distant
    Par coco441 dans le forum C++
    Réponses: 4
    Dernier message: 04/09/2007, 13h26
  3. Lire un fichier dans un serveur ftp
    Par kakrocq dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 12/05/2007, 08h49
  4. [JAR] lire un fichier dans un jar OU hors d'un jar
    Par yveslamand dans le forum Général Java
    Réponses: 13
    Dernier message: 25/04/2005, 14h38

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