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 :

Surveiller l'évolution d'un fichier


Sujet :

C

  1. #1
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut Surveiller l'évolution d'un fichier
    Bonjour,

    Je vous plante le décors. Imaginez un groupe de 1000 personnes qui sont susceptibles de changer d'humeur à tout moment. J'ai une 1001 personne (qu'on nommera la sentinelle) qui doit, si une personne change d'humeur, le noter dans son registre. Pour cela, la sentinelle passe continuellement tour à tour devant chacune des personnes pour vérifier qu'elle n'a pas changé d'humeur depuis son dernier passage. C'est assez fastidieux. L'idéal serait qu'une personne changeant d'humeur s'avance pour se démarquer du groupe et ainsi signaler à la sentinelle qu'elle vient de changer d'humeur.

    Passons maintenant au code. Ces personnes sont en fait des fichiers que j'ouvre, lis et ferme à tour de rôle dans une boucle infinie. Résultat, surcharge CPU (boucle infinie) et filesystem (ouverte/fermeture multiple) et donc ralentissement. J'avais donc dans l'idée de faire un peu comme pour les sockets et utiliser un select ou un truc du genre qui se mettrait en sommeil et ne se réveillerait que sur modification d'un fichier.

    Je suis sous linux (Fedora) et je me disais que vu que select prenait des descripteur de fichier pour fonctionner, j'allais pouvoir l'utiliser sur des fichiers standard au lieu des sockets traditionnelles. Je teste et la rien à faire. Si j'ouvre mon fichier (fopen) récupère le file descriptor (fileno) puis l'utilise dans select, systématiquement select sort immédiatement avec un retour à 1 me signalant que mon fichier est prêt.

    Personne n'aurait un idée ou un piste pour me sortir de ce souci ?
    Membre actif de la Pouy@geTe@m.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Je vous plante le décors. Imaginez un groupe de 1000 personnes qui sont susceptibles de changer d'humeur à tout moment. J'ai une 1001 personne (qu'on nommera la sentinelle) qui doit, si une personne change d'humeur, le noter dans son registre. Pour cela, la sentinelle passe continuellement tour à tour devant chacune des personnes pour vérifier qu'elle n'a pas changé d'humeur depuis son dernier passage. C'est assez fastidieux. L'idéal serait qu'une personne changeant d'humeur s'avance pour se démarquer du groupe et ainsi signaler à la sentinelle qu'elle vient de changer d'humeur.
    C'est original, comme mise en situation… :-)

    Ces personnes sont en fait des fichiers que j'ouvre, lis et ferme à tour de rôle dans une boucle infinie. […] J'avais donc dans l'idée de faire un peu comme pour les sockets et utiliser un select ou un truc du genre qui se mettrait en sommeil et ne se réveillerait que sur modification d'un fichier. Je suis sous linux (Fedora) […] Personne n'aurait un idée ou un piste pour me sortir de ce souci ?
    Je crois que cette facilité est justement un « oubli » historique d'UNIX. Je dis peut-être une grosse ânerie, mais j'avais eu le même problème et, en désespoir de cause, j'avais fini par ouvrir le source de tail pour voir comment fonctionnait le « tail -f »… pour me rendre compte qu'il faisait du polling en vérifiant le fichier toutes les secondes.

    Du coup, il faut chercher du côté des spécificités système. Une rapide recherche m'envoie vers ceci pour Linux. Je n'ai pas eu le temps d'essayer.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 32
    Points
    32
    Par défaut
    Salut,

    regardes du côté de inotify : http://www.linuxjournal.com/article/8478?quicktabs_1=2
    je ne peux pas t'en dire plus car je ne l'ai jamais utilisé mais ça peut répondre à ton problème.

  4. #4
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    C'est original, comme mise en situation… :-)
    C'est souvent les tutoriels qui sont tournés de cette manière pour une meilleure compréhension, donc me suis dit que ça pourrait être sympa de faire la même chose pour poser ma question

    Citation Envoyé par Asta Voir le message
    Salut,

    regardes du côté de inotify : http://www.linuxjournal.com/article/8478?quicktabs_1=2
    je ne peux pas t'en dire plus car je ne l'ai jamais utilisé mais ça peut répondre à ton problème.
    Inotify semble en effet répondre à mes attentes, je vais faire quelques essai avec pour voir si ça répond à tous mes besoins et surtout si il est disponible sur mon système
    Membre actif de la Pouy@geTe@m.

  5. #5
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Petit retour d'utilisation.

    Inotify ne permet pas de surveiller la création d'un fichier spécifique. Pour tous les autres évènements pas de souci, mais lorsque l'on souhaite mettre un watch sur un fichier qui n'existe pas encore => impossible (logique d'ailleurs). On peut surveiller un répertoire néanmoins. Donc je vais voir si je ne peux pas adapter mon système pour ce cas de figure.
    Membre actif de la Pouy@geTe@m.

  6. #6
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Sympa ton analogie, mais malheureusement incomplète avec le fonctionnement d'un système d'exploitation.
    En réalité pour qu'une personne puisse changer d'humeur il faudrait qu'elle demande la permission à un supérieur avant. (le système d'exploitation).
    Ta sentinelle n'a pas alors à vérifier chaque personne mais uniquement l'entrée du bureau du supérieur.

    Dans ce cas précis le supérieur c'est la fonction open (on ne peut pas crée/modifier de fichier sans passer par cet appel système).
    Tu devrais donc simplement hooker ce syscall afin d'obtenir toutes les informations dont tu as besoins.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  7. #7
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Hooker ... hum possible, mais je ne connais pas trop ça ... T'as quelques liens pour que je m'instruise sur le sujet ?

    En attendant, j'ai pu exploiter Inotify pour combler mon besoin
    Membre actif de la Pouy@geTe@m.

  8. #8
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Petite info supplémentaire.
    J'utilise inotify via un thread qui va surveiller jusqu'à 6 fichiers. Je fais donc 1 inotify_init par thread. Arrivé à 242 threads, paff erreur : Too many open files.
    Je pensais que sur les threads le contexte n'était pas partagé, et il semblerait que non ... Je pige pas trop pourquoi sur ce coup.

    EDIT: La limitation est donnée par /proc/sys/fs/inotify/max_user_instances qui est par défaut à 128. Je l'ai passé à 256 et ça a donc doublé le nombre de thread avant erreur. Maintenant il faut que j'encaisse dans les 2000 thread ou plus, mais je connais pas trop la limite raisonnable pour ce paramètre.
    Membre actif de la Pouy@geTe@m.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Si j'ouvre mon fichier (fopen) récupère le file descriptor (fileno) puis l'utilise dans select, systématiquement select sort immédiatement avec un retour à 1 me signalant que mon fichier est prêt.
    Ben oui mais non !!!
    fopen() renvoie un FILE*, pas un fileno. Alors que select() attend des fileno !!!
    Faut ouvrir tes fichiers avec open()... ou alors utiliser je ne sais plus quelle fonction qui associe un fileno à un FILE* !!!

    Citation Envoyé par spin0us Voir le message
    puis l'utilise dans select, systématiquement select sort immédiatement avec un retour à 1 me signalant que mon fichier est prêt.
    Dans lequel des 3 groupes de fileno tu l'utilises ? realfds ? writefds ? exceptfds ?
    De toute façon select() t'indique si un fichier est prêt (à être lu/écrit), pas s'il a été modifié...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    ou alors utiliser je ne sais plus quelle fonction qui associe un fileno à un FILE* !!!
    man fileno(3)
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  11. #11
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Vi comme le précise sloshy, certe j'ouvre le fichier via fopen qui me retourne un FILE * mais fileno() me permet de récupérer le descripteur du fichier ouvert via fopen.
    Membre actif de la Pouy@geTe@m.

  12. #12
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    (c'était une obligation, sans quoi il aurait eu un warning à la compilation)

    Le hook me semble la meilleure solution, certes ça ralentira ton système, mais de la même manière pour 10, 100 ou 1000 fichiers à surveiller.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  13. #13
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    T'aurais quelques liens sur ce hook ? Parce que ça m'évoque rien du tout

    EDIT: ok j'ai rien dit, c'est pas un nom de fonction en particulier mais plutôt un terme générique. On en apprend tous les jours Donc sous linux pour les fichiers c'est bien inotify qui me permettra de hooker les fichiers. Par contre, il a des limitations
    Membre actif de la Pouy@geTe@m.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Petite info supplémentaire.
    J'utilise inotify via un thread qui va surveiller jusqu'à 6 fichiers. Je fais donc 1 inotify_init par thread. Arrivé à 242 threads, paff erreur : Too many open files.
    Je pensais que sur les threads le contexte n'était pas partagé, et il semblerait que non ... Je pige pas trop pourquoi sur ce coup.

    EDIT: La limitation est donnée par /proc/sys/fs/inotify/max_user_instances qui est par défaut à 128. Je l'ai passé à 256 et ça a donc doublé le nombre de thread avant erreur. Maintenant il faut que j'encaisse dans les 2000 thread ou plus, mais je connais pas trop la limite raisonnable pour ce paramètre.
    pourquoi faire un inotify_init par thread ?

    Tu pourrais faire comme ce code-ci (pris au hasard) : http://www.google.com/codesearch/p?h...a=N&cd=5&ct=rc

    Pour résumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inotify_init
    ajout des fichiers à surveiller avec inotify_add_watch
    select pour remonter les événements
    ainsi tu n'a qu'une instance d'inotify utilisé par ton process

  15. #15
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Parce qu'en fait j'ai un thread par client qui gère les échanges du clients, et que j'ai besoin de surveiller les fichiers du client et pas des autres. Du coup, un client se connecte, je fais l'accept puis je lance le thread en communiquant le numéro de la socket nouvellement acceptée. Ensuite, je fais le inotify_init avec la liste des répertoires à surveiller et le select avec les actions correspondant aux retours du select.
    Membre actif de la Pouy@geTe@m.

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

Discussions similaires

  1. Surveiller l'execution d'un fichier
    Par megamario dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/02/2009, 13h28
  2. Comment surveiller l'ouverture d'un fichier
    Par hitech_tm dans le forum C#
    Réponses: 1
    Dernier message: 28/01/2008, 15h45
  3. surveillance répertoire pour création de fichier
    Par gerald2545 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/08/2006, 08h21
  4. Surveillance du fichier alrt.log
    Par cmen76 dans le forum Oracle
    Réponses: 5
    Dernier message: 14/12/2005, 14h09
  5. Surveiller un fichier
    Par jmsd dans le forum MFC
    Réponses: 4
    Dernier message: 10/05/2004, 00h01

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