2010-08-03 4 views
2

J'ai créé un programme suivant dans lequel je souhaite interroger sur le descripteur de fichier du fichier que j'ouvre dans le programme.fichier descripteur interrogation

#define FILE "help" 

int main() 
{ 
     int ret1; 
     struct pollfd fds[1]; 

     ret1 = open(FILE, O_CREAT); 

     fds[0].fd = ret1; 
     fds[0].events = POLLIN; 

     while(1) 
     { 
       poll(fds,1,-1); 

       if (fds[0].revents & POLLIN) 
         printf("POLLING"); 
     } 
     return 0; 
} 

Il va en boucle infinie. Je m'attends à exécuter la boucle quand une opération arrive au fichier. (C'est un fichier ASCII) aide plz

+0

Techniquement, c'est * une * boucle infinie. Il n'a pas de condition de terminaison, et il n'y a pas de déclaration qui sort de la boucle. Voulez-vous dire que la boucle est exécutée plus vite que prévu? –

+0

Que peut-il arriver au fichier? Votre code ne l'écrit jamais. –

+0

Je pense que nous pouvons supposer que cela se passe en dehors de ce processus. – mvds

Répondre

4

poll() ne fonctionne pas réellement sur les fichiers ouverts. Comme un read() sur un fichier ne bloquera jamais, poll() retournera toujours que vous pouvez lire non-bloquant du fichier.

Cela fonctionnerait (presque) sur les périphériques de caractères *, les canaux nommés ** ou les sockets, cependant, puisque ceux-ci bloquent quand vous read() d'eux quand il n'y a aucune donnée disponible. (Vous devez également lire réellement que les données alors, ou un sondage d'autre vous dire encore et encore que les données sont disponibles)

Pour « sondage » un fichier de plus en plus/rétrécissement, voir man inotify ou mettre en œuvre votre propre sondage en utilisant fstat() dans une boucle .

* les périphériques de bloc sont une histoire à part; Alors que techniquement une lecture à partir d'un disque dur peut bloquer pendant 10 ms ou plus, cela n'est pas perçu comme bloquant les E/S sous Linux.
** Voir aussi how to flush a named pipe using bash

+0

Pouvez-vous expliquer "votre propre sondage en utilisant fstat() dans une boucle". – Arpit

+0

Essayez 'strace tail -f somefile' - il dort juste 1 seconde puis vérifie avec fstat si le fichier a grandi. – mvds

1

Aucune idée si cela est la cause de vos problèmes (probablement pas), mais il est une idée particulièrement mauvaise de redéfinir la norme macro FILE. Votre compilateur ne s'est pas plaint à ce sujet?

Questions connexes