网络共享文件系统(NFS)上生成了许多文件。 没有适当的解决方案存在类似的问题:inotify with NFS。
我使用select()来测试文件是否可以读取新数据。 (事实上,有些来自套接字描述符,只是简化了这里)。
但是,我甚至发现文件到文件末尾,它仍然准备好读取状态。
你能建议更好的方法来编写这段代码吗?
fd_set rfds;
struct timeval tv;
int retval;
int i,n,f1,f2,maxfd;
char buf[512];
f1 = fileno(fopen("f1", "rb"));
f2 = fileno(fopen("f2", "rb"));
maxfd = (f1 > f2) ? f1 : f2;
for (i=0; i<3; i++) {
FD_ZERO(&rfds);
FD_SET(f1, &rfds);
FD_SET(f2, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(maxfd+1, &rfds, NULL, NULL, &tv);
if (retval == -1)
perror("select()");
else if (retval) {
printf("Data is available now.\n");
if (FD_ISSET(f1, &rfds)) {
n = read(f1, buf, sizeof(buf));
printf("f1 is ready:%d read %d bytes\n", i, n);
}
if (FD_ISSET(f2, &rfds)) {
n = read(f2, buf, sizeof(buf));
printf("f2 is ready:%d read %d bytes\n", i, n);
}
} else
printf("No data within five seconds.\n");
}
如果我的f1和f2包含3个字节,输出将会跟随。
Data is available now.
f1 is ready:0 read 3 bytes
f2 is ready:0 read 3 bytes
Data is available now.
f1 is ready:1 read 0 bytes <- I wish won't enter here
f2 is ready:1 read 0 bytes <- I wish won't enter here
Data is available now.
f1 is ready:2 read 0 bytes <- I wish won't enter here
f2 is ready:2 read 0 bytes <- I wish won't enter here
答案 0 :(得分:0)
当文件发生变化时,NFS没有办法通知客户端,所以很遗憾你不幸。你需要进行民意调查。
答案 1 :(得分:0)
在Unix中,常规文件始终被视为“快速设备”,因此无法轮询它们。也就是说,正如您已经发现的那样,如果您尝试对它们进行select()或poll(),它们始终会返回“ready”。 IIRC特定于Linux的epoll如果你试图在普通的fd上进行轮询,则会直接返回错误。
如果你想将这样的东西集成到你的事件循环中,你将不得不应用一些胶带。例如。有一个单独的线程,它以适当的间隔尝试读取文件/ fd中的()/ fstat()/ stat(),然后如果它检测到新数据可用,则向管道发送消息。在主事件循环中,您可以轮询管道。