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 help

+0

기술적으로는 * 무한 루프입니다. 종료 조건이 없으며 루프에서 벗어나는 구문이 없습니다. 루프가 예상보다 빨리 실행된다는 의미입니까? –

+0

파일에 어떤 현상이 일어날 수 있습니까? 귀하의 코드는 그것에 쓰지 않습니다. –

+0

나는이 과정 밖에서 일어난다 고 생각할지도 모른다. – mvds

답변

4

poll()은 실제로 열린 파일에는 작동하지 않습니다. 파일의 read()은 결코 차단되지 않으므로 poll()은 항상 파일에서 비 차단을 읽을 수 있다고 반환합니다.

이 문자는 사용 가능한 데이터가 없을 때 read() 때 차단되므로 문자 장치 *, 명명 된 파이프 ** 또는 소켓에서 작동합니다 (거의).

"설문 조사"성장/축소 파일이 man inotify를 참조하거나 루프에서 fstat()을 사용하여 자신의 폴링을 구현하려면 (당신은 또한 실제로 그 데이터를 읽을 필요가, 또는 다른 여론 조사는 다시 말할 것이다 다시 데이터를 사용할 수 있습니다) .

* 블록 장치는 이야기를 구분합니다. 기술적으로 하드 디스크로부터의 읽기는 10ms 이상 블록 될 수 있지만, 이것은 리눅스에서 입출력을 차단하는 것으로 인식되지 않습니다. 이 문제의 원인 (아마) 인 경우
는 ** 아무 생각도 how to flush a named pipe using bash

+0

"자신의 폴링을 fstat() 루프를 사용하여"설명해 주실 수 있습니까? – Arpit

+0

'strace tail -f somefile'을 시도해보십시오. 파일이 커지면 1 초만 기다렸다가 fstat로 검사합니다. – mvds

1

을 볼 수 없지만, 표준 매크로 FILE을 재정의 특히 나쁜 생각이다. 컴파일러가 이에 대해 불평하지 않았습니까?