2010-08-03 284 views
2

我创建了一个下面的程序,我希望在该程序中打开的文件的文件描述符上进行轮询。文件描述符轮询

#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; 
} 

它进入无限循环。我期望在文件发生某些操作时运行循环。 (它是一个ASCII文件) plz help

+0

从技术上讲,它*是一个无限循环。它没有终止条件,并且没有任何突破循环的语句。你的意思是说循环执行速度比你预期的要快吗? – 2010-08-03 10:44:31

+0

该文件可能发生什么?你的代码永远不会写入它。 – 2010-08-03 10:44:37

+0

我认为我们可能会认为这发生在这个过程之外。 – mvds 2010-08-03 11:02:42

回答

4

poll()实际上在打开的文件上不起作用。由于文件上的read()永远不会阻塞,所以poll()将始终返回,您可以从文件中读取非阻塞。

的字符设备*,命名管道**或插座这将(几乎)工作,虽然,因为这些块时,你read()从他们当没有数据可用。 (你还需要实际读取数据的话,否则投票将再次告诉我们,再次证明数据是可用的)

要“人头”越来越/缩小文件,请参阅man inotify或循环使用fstat()实现自己投票。

*块设备是一个故事分开;技术上来说,从硬盘读取数据可能会阻塞10 ms或更长时间,但这在Linux中不会被视为阻塞I/O。
**也看到how to flush a named pipe using bash

+0

你能否请你解释一下“你自己使用循环中的fstat()进行轮询”。 – Arpit 2010-08-03 12:09:01

+0

尝试'strace tail -f somefile' - 它只是睡1秒,然后用fstat检查文件是否增长。 – mvds 2010-08-03 12:21:54

1

不知道,如果这是你的问题的原因(可能不是),但它是一个特别坏主意,重新定义标准宏FILE。 你的编译器没有抱怨过这个吗?