OVH Cloud OVH Cloud

inotify sur un repertoire: le champs inotify_event.len semble rester=0 pour un repertoire

82 réponses
Avatar
Zeyes
J'ai poste ca aussi sur fr.comp.os.linux.debats parceque ca bouge pas
mal la-bas..
;-)

Bonour,
j"ai regarde
http://www.linuxjournal.com/node/8478/print
Extrait:
"
The name field contains the name of the object to which the event
occurred, relative to wd, if applicable. For example, if a watch for
writes in /etc triggers an event on the writing to /etc/vimrc, the name
field will contain vimrc, and the wd field will link back to the /etc watch
"
Mais ca marche pas chez moi: le champs inotify_event.len reste a 0,
alors qu'il semble rester des octets a lire...
quelqu'un a une idee?
Est-ce normal? Pas encore implemente?
Merci

10 réponses

Avatar
Luc.Habert.00__arjf
Zeyes :

Ben tu realloue x a chaque read ?


Oui, mais sur la pile, donc c'est essentiellement instantané.

Avatar
Zeyes
Zeyes :

Ben tu realloue x a chaque read ?


Oui, mais sur la pile, donc c'est essentiellement instantané.
Ah, je te l'avais dit!!!

;-)
Il faut quand meme que ce soit la derniere variable locale declaree,
sinon..... non?

Tiens as-tu une idee de la _meilleure_ facon de traiter les arguments?
Y"a plein d'exemples, de facons de faire differentes, mais je
souhaiterais ton avis a toi, justifie en plus ;-) !!!!
Mon "style" de prog n'a pas l'air "compatible" Linux, mais j'ai mes
raisons, que je n'exposerai pas ici...
Alors au cas ou je serai amene a re-exposer mon code... (il me sera
utile a moi-meme tout seul en tout cas)
Voila,...
Heu, au fait: pour eviter poll(), il faut que je fasse un read
bloquant... mais j'ai pas trouve. Read(1000) dans mon cas ne bloque pas,
et renvoie bien 32... je sais pas trop ou chercher.

Merci encore (tu vas devenir mon mentor pour mes premiers pas Linux :-D )
C'est mon premier programme Linux.... d'habitude il me sert "juste" a
utiliser mon PC. Mais j'aime apprendre, pas de pbs.
A bientot, j'espere.


Avatar
Zeyes
Heu, au fait: pour eviter poll(), il faut que je fasse un read
bloquant... mais j'ai pas trouve. Read(1000) dans mon cas ne bloque pas,
et renvoie bien 32... je sais pas trop ou chercher.
Ben en fait, je peux pas eviter poll !!!!

Puisque je doit attendre d'avoir un truc, afin de connaitre sa taille!
Donc poll, allocation, read... oblige!
Ouf je suis pas si nul en fait! Meme si c'est un coup de bol, du aux
specifites du inotify!

Avatar
Luc.Habert.00__arjf
Zeyes :

Il faut quand meme que ce soit la derniere variable locale declaree,
sinon..... non?


Bein tu la déclares après avoir calculé sa taille. C'est du C99, avant on
n'avait pas le droit (ni aux tableaux de taille variable, d'ailleurs).

Tiens as-tu une idee de la _meilleure_ facon de traiter les arguments?


Que veux-tu dire?

Heu, au fait: pour eviter poll(), il faut que je fasse un read
bloquant... mais j'ai pas trouve. Read(1000) dans mon cas ne bloque pas,
et renvoie bien 32...


C'est parfaitement normal. C'est un read partiel. Si tu relances un read
juste derrière, il devrait se mettre à bloquer. Mais bon, vu qu'on a affaire
à un machin bizaroide qui ne réagit pas comme un flux d'octets normal, je
pense qu'il vaut mieux en fait utiliser poll+ioctl(FIONREAD) comme le dit la
page de man sans chercher à finasser.

Avatar
Luc.Habert.00__arjf
Zeyes :

Il faut quand meme que ce soit la derniere variable locale declaree,
sinon..... non?


Non, le compilo se débrouille.

Tiens as-tu une idee de la _meilleure_ facon de traiter les arguments?


Que veux-tu dire?

Heu, au fait: pour eviter poll(), il faut que je fasse un read
bloquant... mais j'ai pas trouve. Read(1000) dans mon cas ne bloque pas,
et renvoie bien 32...


C'est parfaitement normal. C'est un read partiel. Si tu relances un read
juste derrière, il devrait se mettre à bloquer. Mais bon, vu qu'on a affaire
à un machin bizaroide qui ne réagit pas comme un flux d'octets normal, je
pense qu'il vaut mieux en fait utiliser poll+ioctl(FIONREAD) comme le dit la
page de man sans chercher à finasser.

Avatar
Zeyes
Heu, au fait: pour eviter poll(), il faut que je fasse un read
bloquant... mais j'ai pas trouve. Read(1000) dans mon cas ne bloque pas,
et renvoie bien 32... je sais pas trop ou chercher.
Ben en fait, je peux pas eviter poll !!!!

Puisque je doit attendre d'avoir un truc, afin de connaitre sa taille!
Donc poll, allocation, read... oblige!
Ouf je suis pas si nul en fait! Meme si c'est un coup de bol, du aux
specifites du inotify!




Avatar
Zeyes
Zeyes :

Il faut quand meme que ce soit la derniere variable locale declaree,
sinon..... non?


Bein tu la déclares après avoir calculé sa taille. C'est du C99, avant on
n'avait pas le droit (ni aux tableaux de taille variable, d'ailleurs).
Les variables locales suivantes doivent etre recopiees ailleurs dans la

pile si la taille de ta variable change non? Surtout si tu en as deux
qui changent de taille regulierement.Je suis peut-ete un peu
dinosoresque.....

Tiens as-tu une idee de la _meilleure_ facon de traiter les arguments?


Que veux-tu dire?

Comment gererais-tu les "-l", "--listemodifiedfiles", "--", etc....

passes en arguments que j"aimerais traiter


Avatar
Zeyes
Ah et une question Usenet (j'ai lu les FAQs, mais c'est un peu dense):
tu crois que je devrais supprimer des messages moi-meme, ou ils vont
etre "oublies" dans qq temps.... parce que ce thread/topic devient un
peu... heu... pieuvresque!
Avatar
Luc.Habert.00__arjf
Zeyes :

Les variables locales suivantes doivent etre recopiees ailleurs dans la
pile si la taille de ta variable change non? Surtout si tu en as deux
qui changent de taille regulierement.Je suis peut-ete un peu
dinosoresque.....


Bah c'est le compilo qui fait sa tambouille. Une méthode qui m'a l'air de
marcher :
- tu mets les variables de taille fixe stockées au début du bloc
d'activation, tandis que les variables de taille dynamique n'y sont
représentées que par un pointeur
- quand tu crées un tableau dynamique, tu stockes l'adresse du bout
du bloc d'activation dans le pointeur correspondant à la variable en
question, et tu étends de la place nécessaire le bloc d'activation
- quand tu quittes un bloc, tu réduis son bloc d'activation.

Comme ça, ça reste du LIFO, ça se gère efficacement.

Après, je crois me souvenir qu'on m'avait expliqué qu'il y a des
interactions immondes avec certaines subtilités genre longjmp, qui ne sont
pas encore bien gérées par les compilateurs.

Comment gererais-tu les "-l", "--listemodifiedfiles", "--", etc....
passes en arguments que j"aimerais traiter


Regarde la fonction getopt (man 3 getopt).

Avatar
Luc.Habert.00__arjf
Zeyes :

tu crois que je devrais supprimer des messages moi-meme,


Surtout pas! Ce thread peut interesser des gens. Même si c'est un peu
bordélique, on a quand même touché pas mal de points intéressants.

La solution, c'est d'être moins bordélique la prochaine fois.

ou ils vont etre "oublies" dans qq temps....


La plupart des serveurs virent les messages au bout de O(1) semaines. Mais
il y en a qui archivent, par exemple Google.