Comment puis sélectionnez() attendre régulier sur les descripteurs de fichiers (non-prises de courant)?
C'est l'exemple de code à partir de "l'homme sélectionnez" plus que quelques lignes pour lire un fichier qui est en cours d'écriture. Je me doutais bien que lorsque le ./myfile.txt
est écrit, select
serait de retour que l'on peut maintenant lire à partir de ce fd. Mais ce qui se passe est que sélectionnez revient constamment dans la boucle while tant que le fichier txt existe. Je veux qu'il ne reviendra que lorsque de nouvelles données sont écrites à la fin du fichier. J'ai pensé que c'est la façon dont il devrait fonctionner.
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
int fd_file = open("/home/myfile.txt", O_RDONLY);
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(fd_file, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
while (1)
{
retval = select(fd_file+1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");
}
exit(EXIT_SUCCESS);
}
Alors, quelle est votre question ? Qui a dit
question édité. désolé pour la confusion.
je comprends la première partie de votre commentaire. Mais je pensais que le but de la sélection sur un socket a été fondamentalement juste à l'écoute lorsque les données ont été écrites à la socket. Comment est-il différent d'un fichier?
select
travailler uniquement sur des sockets ?question édité. désolé pour la confusion.
select
peut être utilisé sur aucun type de fichier descripteur, n'a pas d'importance si c'est une prise, d'un fichier ou d'un tuyau ou d'un descripteur. Cependant, vous ne pouvez pas les utiliser pour vérifier si un fichier a été écrit à, pour cela vous devez utiliser quelque chose de spécifique au système d'exploitation, comme sur Linux, vous pouvez utiliser inotify.je comprends la première partie de votre commentaire. Mais je pensais que le but de la sélection sur un socket a été fondamentalement juste à l'écoute lorsque les données ont été écrites à la socket. Comment est-il différent d'un fichier?
OriginalL'auteur glutz | 2012-08-10
Vous devez vous connecter pour publier un commentaire.
Les fichiers du disque sont toujours prêt à lire (mais la lecture peut retourner 0 octets si vous êtes déjà à la fin du fichier), de sorte que vous ne pouvez pas utiliser
select()
sur un fichier du disque pour savoir quand de nouvelles données sont ajoutées au fichier.POSIX dit:
Aussi, comme cnicutar souligné dans un désormais supprimé le post, en général, vous devez l'initialiser le FD_SET à chaque itération. Dans votre code, vous êtes le suivi d'une fd, et que fd est toujours prêt, de sorte que le FD_SET n'est pas en fait en train de changer. Toutefois, si vous avez 5 decriptors à suivre, et
select
détecte qu'un seul est prêt, puis sur la prochaine itération, celui-là seul descripteur serait surveillé (sauf si vous réinitialisez le FD_SET). Cela rend l'utilisation deselect
délicat.Autant que je sache
poll
ne peut pas être utilisé pour regarder un fichier régulier pour des changements. Donc, la seule façon d'avancer estinotify
? Le problème estinotify
à base de solution fonctionne avec chemin d'accès, pas avec les fichiers descripteurs qui sont déjà ouvertes.OriginalL'auteur Jonathan Leffler