2013-05-07 2 views
0

Mon programme utilise inotify pour surveiller les modifications sur les fichiers. Mon code est le suivant:lire sur le descripteur inotify est bloqué pour toujours

fd = inotify_init(); 
    wd = inotify_add_watch(fd, "./test.txt", IN_ALL_EVENTS); 
    len = read(fd, buff, BUFF_SIZE); 
    while (i < len) { 
     struct inotify_event *pevent = (struct inotify_event *) &buff[i]; 
       //process events 
     i += sizeof(struct inotify_event) + pevent->len; 
    } 

Cependant, après avoir eu plusieurs événements pour le premier changement dans les fichiers surveillés (événement IN_OPEN, IN_MODIFY, IN_ACESS, etc.), par la suite des changements dans les fichiers surveillés ne génère aucune d'autres événements ==> mon programme traîner à la fonction de lecture (la lecture est bloquée)

Pourriez-vous les gars m'aider à expliquer cette erreur.

Répondre

0

S'il vous plaît montrer quelles opérations se produisent réellement à "./test.txt" et plus sur votre code (buff, BUFF_SIZE). Et voici un point pour vous de vérifier:

  • Il y a des événements spéciaux comme IN_IGNORED qui peut enlever la montre du fichier
  • Je suggère d'utiliser select/poll/epoll pour surveiller la fd plutôt que bloquante dessus.
+0

merci pour votre réponse. Ça m'aide beaucoup. Je veux juste vous poser une autre question. Pourquoi quand j'ouvre le fichier en utilisant Vim ou Gedit, j'ai toujours l'événement IN_DELETE_ITSELF? – khanhhh89

+0

@ khanhhh89 Je crois que vous avez édité "test.txt" et enregistrez-le. Mon vim est 7.3 et je trouve qu'il utilise réellement 'open (" test.txt ", O_WRONLY | O_CREAT | O_TRUNC, 0664)' et y écrit le contenu. Donc je crois que ** IN_DELETE_ITSELF ** est causé par O_TRUNC. – xgwang

+0

@wgwang Donc, c'est la raison pour laquelle, après avoir lu les premiers événements, en utilisant inotify_add_watch ("test.txt") à nouveau se traduira par une erreur "Aucun fichier ou répertoire" ??? – khanhhh89

Questions connexes