2010-08-03 2 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

+0

Технически, это * бесконечный цикл. Он не имеет условия завершения, и нет инструкции, которая выходит из цикла. Вы имеете в виду, что цикл выполняется быстрее, чем вы ожидали? –

+0

Что может случиться с файлом? Ваш код никогда не пишет. – 2010-08-03 10:44:37

+0

Я думаю, мы можем предположить, что это происходит за пределами этого процесса. – mvds

ответ

4

poll() фактически не работает с открытыми файлами. Поскольку read() в файле никогда не будет блокироваться, poll() всегда будет возвращать, что вы можете читать неблокирование из файла.

Это будет (почти) работать на символьных устройствах *, именованных каналах ** или сокетах, хотя, поскольку они блокируются, когда вы не используете read(), когда данных нет. (Вы также должны фактически прочитать эти данные затем, либо опрос покажет снова и снова, что имеются данные)

К «опрос» растет/сокращение файла см man inotify или реализовать свой собственный опрос с помощью fstat() в цикле ,

* блочные устройства - это история; в то время как технически чтение из жесткого диска может блокироваться в течение 10 мс или более, это не воспринимается как блокирование ввода-вывода в Linux.
** не видят также how to flush a named pipe using bash

+0

Можете ли вы объяснить «свой собственный опрос, используя fstat() в цикле». – Arpit

+0

Попробуйте 'strace tail -f somefile' - он просто спит 1 секунду, а затем проверяет с помощью fstat, если файл вырос. – mvds

1

Никакая идея, если это является причиной ваших проблем (вероятно, нет), но это особенно плохая идея, чтобы переопределить стандартный макрос FILE. Разве ваш компилятор не жаловался на это?

Смежные вопросы