2010-08-03 336 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。 你的編譯器沒有抱怨過這個嗎?