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 :

Parcours d'arborescence, mais processus bloqué...


Sujet :

Linux

  1. #1
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut Parcours d'arborescence, mais processus bloqué...
    Bonsoir à tous,

    J'ai programmé une fonction récursive de parcours de l'arborescence, et mon but est de trouver tous les fichiers de l'arborescence qui contiennent une chaine passée en paramètre du programme. Voici le code qui recherche la présence d'une chaîne de caractère dans un fichier :

    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
    int testContents(char* name, char* contents)
    {
      char* buffer = (char*) malloc(2048);
     
      FILE* file;
      off_t filePosition = 0;
      int found = 0;
     
      if ((file = fopen(name, "r")) != NULL)
      {
        while ((!feof(file)) && (found == 0))
        {
          int numberRead = fread(buffer, 1, 2048, file);
          if ((numberRead != 0) && (numberRead != 1))
          {
            found = (strstr(buffer, contents) != NULL) ? 1 : 0;
            filePosition = filePosition + 2048 - strlen(contents);
            fseek(file, filePosition, SEEK_SET);
          }
          if(found)
          	printf("\t %d", filePosition);
        }
        fclose(file);
      }
      free(buffer);
      return found;
    }
    Cette fonction marche sans problème pour un seul fichier, mais lorsque je l'appelle lors du parcours de l'arborescence, le programme est bloqué après avoir vérifié quelques fichiers... Et si je tape un ps -aAl dans une autre console il me sort quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    100 S     0   514   307 17  69   0 -   429 acpi_b ttyp0    00:00:31 dirent
    Je ne sais pas trop quoi en penser donc, mais surtout je ne vois pas ce qui pourrais causer ceci, sachant que mon parcours récursif marche parfaitement aussi...

    Je compile avec gcc 2.95 sous Debian... Si vous avez une idée sur la cause de cet endormissement soudain...

    Merci d'avance
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 208
    Points : 218
    Points
    218
    Par défaut
    Ben... moi j'ai une idée

    Si tu parcours certains repertoires (depuis la racine par exemple) ta boucle va au bout d'un moment vouloir lire le contenu d'un fichier temporaire par exemple.

    Donc un fichier en cours d'utilisation par ton système par exemple (fichier de session X ou je ne sais quoi d'autre...). Par conséquent, exclusion mutuelle oblige, ton programme doit attendre que la ressource soit disponible. Ce qui eventuellement n'arrivera jamais tant que le PC est sous tension...

    Voilà, j'espère que ça t'aide.

  3. #3
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Sous linux il n'y a pas d'exclusion mutuelle en lecture et plusieurs processus peuvent lire un même fichier sans problème.

    Es-tu sur que la fonction de recherche marche ? Faire un strstr sur un buffer qui peut contenir n'importe quoi ... étonnant que tu ne fasse pas de segfault. Je suppose donc que tu fais des tests uniquement avec des fichiers texte, mais dans ce cas tu vas probablement rater des occurences.

    Je ne comprend pas non plus le pourquoi du fseek

    Vérifie également si tu n'essaie pas de lire un fichier particulier comme un répertoire ou un fichier virtuel.

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Citation Envoyé par vic
    Faire un strstr sur un buffer qui peut contenir n'importe quoi
    Ben à priori le buffer contient des caractères. La déclaration du buffer est un char* de taille 8192.

    Citation Envoyé par vic
    Je suppose donc que tu fais des tests uniquement avec des fichiers texte, mais dans ce cas tu vas probablement rater des occurences.
    Non je fais des tests sur tous les fichiers réguliers et que sur les fichiers réguliers d'ailleurs, pas sur les répertoires ou autres

    Citation Envoyé par vic
    Je ne comprend pas non plus le pourquoi du fseek
    Le fseek permet de se reposstionner après la lecture. Si tu imagines que la chaîne que je cherche est coupée entre deux buffer lorsque je lis le fichier, tu peux voir que je trouverais jamais ma chaîne entière. Donc si je recule, après chaque lecture de 8192 caractères, de la longueur de la chaîne dans le fichier, la chaîne que je cherche ne sera pas coupée.

    Mais apparemment ce code marche pafaitement sur les machines dont on dispose à la fac (Fc2 avec gcc 3.3) alors que chez moi (Debian Woody avec gcc 2.95), ce code ne fonctionne plus... Sur une mandrake 10, ce code marche également... Aucune explication a été trouvée jusque là

    Merci à tous ceux qui ont répondu
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Citation Envoyé par vic
    Faire un strstr sur un buffer qui peut contenir n'importe quoi
    Ben à priori le buffer contient des caractères. La déclaration du buffer est un char* de taille 8192.
    En C un char représente un octet, c'est ce que j'appelle n'importe quoi.
    La fonction strstr détecte la fin de la chaîne par un \0, s'il est absent du buffer tu te prends un beau segfault.

    Sinon, pour ton problème, je ne vois pas Il est peut être ailleurs que dans cette fonction.

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

Discussions similaires

  1. Arborescence de processus
    Par Tuxico dans le forum POSIX
    Réponses: 9
    Dernier message: 09/08/2009, 12h29
  2. Un petit script facile mais qui bloque
    Par Whombat dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2007, 20h15
  3. dll qui compile mais qui bloque en appel
    Par darkman10 dans le forum Windows
    Réponses: 7
    Dernier message: 09/05/2006, 15h02
  4. [VB6]QuestionXML simple... mais je bloque...
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2006, 21h08
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

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